linux多线程【8】mmap实现父子进程的共享内存通信,用信号量同步
来源:互联网 发布:蓝思网络杨帆 编辑:程序博客网 时间:2024/05/16 08:24
1.创建文件。open,ftruncate
2.将文件映射到内存。内存首地址存放一个sem_t实现进程的互斥。mmap,sem_init
3.创建子进程。父子进程互斥地访问共享内存的内容。fork,sem_wait,sem_post
4.取消映射。munmap
由于需要同步或者互斥,因此需要sem_t,我们把他放在内存区的开头,那么真正可用的内存就是开头做一定偏移。维护一个指针,使指针
指向实际数据区。就定义一个结构体:
struct file_content{ sem_t st; void *pv;} file_content;
初始化时:
pfc->pv = (void *) ((char *) pfc + sizeof (struct file_content)); // pv指向结构体下一个字节的地址
这样,st就是sem_t信号量。pv就是数据指针,比较方便!
另外,sem_t初始化时第二个参数设为1,表示用于进程间而不限于进程间的访问。
#include <unistd.h>#include <fcntl.h>#include <ctype.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/stat.h>#include <errno.h>#include <syslog.h>#include <errno.h>#include <sys/types.h>#include <sys/mman.h>#include <semaphore.h>struct file_content{ sem_t st; void *pv;} file_content;#define NINT 16#define FILE_ "map_file"// 映射文件#define FILE_MODE S_IRUSR | S_IWUSR// 打开文件的权限modeintmain (int argc, char *argv[]){ int fd; struct file_content *pfc; //打开文件 fd = open (FILE_, O_RDWR | O_CREAT, FILE_MODE); if (fd == -1) { printf ("file open failed!\n"); exit (2); } //将文件变为256大小 ftruncate (fd, sizeof (file_content) + sizeof (int) * NINT); //内存映射 pfc =mmap (NULL, sizeof (file_content) + sizeof (int) * NINT, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (pfc == MAP_FAILED) { printf ("map failed!\n"); exit (3); } // 关闭文件 close (fd); sem_init (&(pfc->st), 1, 1);//信号两初始化为1,用于互斥 pfc->pv = (void *) ((char *) pfc + sizeof (struct file_content)); // pv指向结构体下一个字节的地址 printf ("结构体地址:\t\t%x\n结构体下一位置地址:\t\t%x\n", (int)pfc, (int)pfc->pv);setbuf(stdout,NULL); // 不加上这句的话,可能输出会卡在那里!//////////////////////////////////////////////// if (fork () == 0)//子进程 { int i; while (1) {sem_wait (&(pfc->st));printf ("Child process\n");int *p = pfc->pv;for (i = 0; i < NINT; i++) { p[i] = 2 * i; }/*for (i = 0; i < NINT; i++) { printf ("%d ", p[i]); }printf ("\n"); */sem_post (&(pfc->st)); usleep(2000); } } else// 父进程 { int i; while (1) {sem_wait (&(pfc->st));printf ("Father process\n");int *p = pfc->pv;for (i = 0; i < NINT; i++) { p[i] = 3 * i; }/*for (i = 0; i < NINT; i++) { printf ("%d ", p[i]); }printf ("\n");*/sem_post (&(pfc->st));usleep(2000); } }//////////////////////////////////////////////// if (munmap (pfc, sizeof (file_content) + sizeof (int) * NINT) == -1) { printf ("ummap!\n"); exit (2); } return 0;}
父子进程都是无线运行的,需要按ctrl+c退出:
administrator@ubuntu:~/test$ ./sh结构体地址:b7717000结构体下一位置地址:b7717014Father processChild processFather processChild processFather processChild processFather processChild processFather process
- linux多线程【8】mmap实现父子进程的共享内存通信,用信号量同步
- Linux下通过共享内存进行进程间通信,进程间同步使用信号量来实现
- Linux下通过共享内存进行进程间通信,进程间同步使用信号量来实现
- linux进程同步与通信(共享内存和信号量)
- linux 中mmap的用法(进程间通信-共享内存)
- linux进程间的通信(C): 使用信号量进行同步的共享内存机制
- linux进程间的通信(C): 使用信号量进行同步的共享内存机制
- linux进程间的通信(C): 使用信号量进行同步的共享内存机制
- Linux进程共享通信 -- mmap实现
- 父子进程间的共享内存通信
- 进程通信----共享内存以及mmap函数实现共享内存
- Linux--进程间通信-共享内存-信号量
- linux进程通信之信号量、共享内存
- 通过共享内存和信号量实现进程间的通信
- 进程通信--mmap内存共享
- 进程通信-共享内存-mmap()
- 共享内存多进程间通信,进程间同步使用信号量来实现
- 共享内存多进程间通信,进程间同步使用信号量来实现
- WebDriver2.32 IllegalStateException: The path to the driver executable
- N!及其后面有多少个零
- 使用ssh记住密码
- 【专题】线段树
- 不得不承认 这个比我总结的好多了 虽然是理论但是确实好
- linux多线程【8】mmap实现父子进程的共享内存通信,用信号量同步
- Java集合类详解
- 黑马程序员基础-----网络编程
- 浅谈分布式开发
- 标准C++中的string类的用法总结
- 使能linux驱动中的dev_dbg .
- 堆排序算法
- 开源软件中 几种经典的Hash算法的实现
- Windows下的Win32串口编程