Linux进程间通信(4):共享内存

2019-07-12 23:49发布

接上一篇的内容——Linux进程间通信(3):信号量 参考书籍:《从实践中学嵌入式linux应用程序开发》(华清远见嵌入式学院)
UNIX网络编程 卷2 进程间通信(第2版)(中文版)
资料下载: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"); }