进程间通信(共享内存+互斥锁)
上一篇进程间通信:共享内存没有实现互斥锁保护,今天用信号量实现一个进程间互斥锁,保护共享变量的修改。
参考资料:
【进程间通信(共享内存+互斥锁)】http://man7.org/linux/man-pages/man7/sem_overview.7.html
http://man7.org/linux/man-pages/man3/sem_init.3.html
http://man7.org/linux/man-pages/man3/sem_post.3.html
http://man7.org/linux/man-pages/man3/sem_wait.3.html
http://man7.org/linux/man-pages/man3/sem_destroy.3.html
实现思路:父进程开辟一段共享内存,将开始sizeof(sem_t)大小作为互斥锁存储空间,在父进程中映射这一段内存,在之后fork的子进程将会继承这一映射关系,进而实现进程间共享互斥锁。
代码实现:
#include #include#include #include #include #include #include #include #define MAPPING_SIZE 4096int main (int argc,char* argv[]){ int mapfd; const char* mapname = "/number"; // 开辟一段共享内存 mapfd = shm_open(mapname,O_RDWR|O_CREAT,S_IRUSR | S_IWUSR); if(mapfd == -1){ perror("shm_open fail"); exit(EXIT_FAILURE); } // ftruncate可以用来设置共享内存到指定大小 if(ftruncate(mapfd,MAPPING_SIZE) == -1){ perror("ftruncate fail"); close(mapfd); exit(EXIT_FAILURE); } // 将共享内存开始处作为进程间互斥锁 void* sp = mmap(NULL,MAPPING_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,mapfd,0); if(sp == NULL){ perror("mmap fail"); close(mapfd); exit(EXIT_FAILURE); } sem_t* mutex = (sem_t*)sp; if(sem_init(mutex,1,1) != 0) { perror("sem_init fail"); close(mapfd); exit(EXIT_FAILURE); } int * num = (int*)(sp+sizeof(sem_t)); int stat,cid,n,procCount=0,maxProcCount=8; for(n = 0; n
运行效果:
[root@centos7 c]# gcc -lrt -pthread process.c -o process [root@centos7 c]# ./process Process 11086: 1 Process 11087: 2 Process 11088: 3 Process 11089: 4 Process 11090: 5 Process 11092: 6 7 cid 11086 exit. 6 cid 11087 exit. 5 cid 11088 exit. 4 cid 11089 exit. 3 cid 11090 exit. 2 cid 11092 exit. Process 11093: 7 Process 11091: 8 1 cid 11093 exit. 0 cid 11091 exit.
转载于:https://www.cnblogs.com/ling-diary/p/10538275.html
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- 开学第一天(下)
- 20170612时间和注意力开销记录
- 闲杂“细雨”
- 时间老了
- 人间词话的智慧
- 读司马懿,知人间事,品百味人生
- Eddy小文
- C语言中的时间函数clock()和time()你都了解吗
- 我和你之前距离