接上一篇的内容——Linux进程间通信(3):信号量 参考书籍:《从实践中学嵌入式linux应用程序开发》(华清远见嵌入式学院)
资料下载:
http://download.csdn.net/detail/klcf0220/5332973 参考链接:mmap()及其相关系统调用:
http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html 系统V共享内存:
http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index2.html 简介:
共享内存可以说是最为高效的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。
共享内存: 实现步骤:
1、创建共享内存,用到的函数是shmget(),也就是从内存中获得一段共享内存区域;
2、映射共享内存,用到的函数时shmat(),也就是把这段创建的共享内存映射到具体的进程空间中。
3、除此之外,还有撤销映射的操作,其函数为shmdt()。
参考实例:
/***** SHM_write.c *******/
#include
#include
#include
#include
#include<string.h>
typedef struct{
char name[4];
int age;
} people;
main(int argc, char** argv)
{
int shm_id,i;
key_t key;
char temp;
people *p;
char* NAME = "/tmp";
key = ftok(NAME,0);
if(key==-1)
perror("ftok error");
shm_id=shmget(key,4096,IPC_CREAT);
if(shm_id==-1)
{
perror("shmget error");
return;
}
p=(people*)shmat(shm_id,NULL,0);
temp='a';
for(i = 0;i<10;i++)
{
temp+=1;
memcpy((*(p+i)).name,&temp,1);
(*(p+i)).age=20+i;
}
if(shmdt(p)==-1)
perror(" detach error ");
}
/********** SHM_read.c ************/
#include
#include
#include
#include
#include
#include<string.h>
typedefstruct{
char name[4];
int age;
} people;
main(int argc, char** argv)
{
int shm_id,i;
key_t key;
people*p;
char* NAME = "/tmp";
key= ftok(NAME,0);
if(key == -1)
perror("ftok error");
shm_id= shmget(key,4096,IPC_CREAT);
if(shm_id == -1)
{
perror("shmget error");
return;
}
p= (people*)shmat(shm_id,NULL,0);
for(i = 0;i<10;i++)
{
printf("name:%s ",(*(p+i)).name );
printf("age %d
",(*(p+i)).age );
}
if(shmdt(p) == -1)
perror(" detach error");
}