mmap父子进程间通信
父子等有血缘关系的进程之间也可以通过mmap建立的映射区来完成数据通信。但相应的要在创建映射区的时候指定对应的标志位参数flags:MAP_PRIVATE:(私有映射)父子进程各自独占映射区;MAP_SHARED:(共享映射)父子进程共享映射区。
//父进程创建映射区,然后fork子进程,子进程修改映射区内容,而后,父进程读取映射区内容,查验是否共享。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/wait.h>int var = 100; //全局变量int main(void)
{int *p;pid_t pid;int fd;fd = open("temp", O_RDWR|O_CREAT|O_TRUNC, 0644);if(fd < 0){perror("open error");exit(1);}unlink("temp"); //删除临时文件目录项,使之具备被释放条件,该文件没有存在的必要,仅用于完成映射区,来用于父子进程间通信,因此unlink。ftruncate(fd, 4);//p = (int *)mmap(NULL, 4, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);p = (int *)mmap(NULL, 4, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);if(p == MAP_FAILED) { perror("mmap error");exit(1);}close(fd); //映射区建立完毕,即可关闭文件pid = fork(); //创建子进程if(pid == 0){*p = 2000;var = 1000;printf("child, *p = %d, var = %d\n", *p, var);} else {sleep(1);printf("parent, *p = %d, var = %d\n", *p, var);wait(NULL);int ret = munmap(p, 4); //释放映射区if (ret == -1) {perror("munmap error");exit(1);}}return 0;
}
[root@localhost mmap]# ./fork_mmap //参数指定为MAP_PRIVATE,能通信
child, *p = 2000, var = 1000
parent, *p = 0, var = 100 //0是随机值,对于没有初始化的指针,其指向的内容是不确定的
[root@localhost mmap]# ./fork_mmap //参数指定为MAP_SHARED,不能通信
child, *p = 2000, var = 1000
parent, *p =2000, var = 100
结论:父子进程共享:1. 打开的文件;2. mmap建立的映射区(但必须要使用MAP_SHARED)。
mmap父子进程间通信相关推荐
- Linux系统编程---5(共享存储映射,存储映射I/O,mmap函数,父子进程间通信,匿名映射)
共享存储映射 文件进程间通信 使用文件也可以完成 IPC,理论依据是,fork 后,父子进程共享文件描述符.也就共享打开的文件. 编程:父子进程共享打开的文件.借助文件进行进程间通信. 测试代码 /* ...
- Linux的基础知识——mmap父子通信进程和匿名通信
1.mmap父子进程通信 \qquad父子等有血缘关系的进程之间也可以通过mmap建立的映射区来完成数据通信.但相应的要在创建映射区时候指定对应的标志位参数flags: \qquadMAP_PRIVA ...
- Linux系统编程:mmap介绍和使用mmap实现进程间通信
mmap函数介绍 这个函数有啥子作用?m-> memory 内存,map ->映射,见名知义,就是创建内存映射区,作用就是:将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件.所 ...
- Linux:进程间通信(创建匿名管道,父子进程间通信,兄弟进程间通信)
过一遍管道的基础知识: 1.本质:存在于高速缓存区,属于伪文件,不占用磁盘空间.缓冲区大小默认4K,可根据实际情况适当调整 2.读端和写端各自对应一个文件描述符,数据从写端流入,读端流出 3.操作管道 ...
- 使用管道完成父子进程间通信
什么是进程间通信 Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间.任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须 ...
- linux+mmap父子通信_linux库函数mmap()原理?转载
linux库函数mmap()原理 转载 1.mmap基本概念 2.mmap内存映射原理 3.mmap和常规文件操作的区别 4.mmap优点总结 5.mmap相关函数 6.mmap使用细节 7.mmap ...
- Linux网络处理“零拷贝”技术mmap()内核进程间通信设计8086分页管理——摆在一起来谈谈...
Jack:最近听说了网络处理的"零拷贝"技术,觉得非常神奇,在网上查阅了很多资料.不过,并不是太明白--知其然,而不知其所以然.你能通俗地解释一下吗? 我:这是一个相对比较复杂的话 ...
- python之父子进程间通信
当进行fork的时候,父父进程的信息会复制到子进程,这本身已经是一种通信方式了,即子进程复制父进程资源,除此之外,还想让这两个进程进行通信,有什么方法呢?可以使用socketpair的方式. 我的疑惑 ...
- Java启动子进程以及父子进程间通信
启动进程的方式说明 通过 new ProcessBuilder(String ...commands).start() 启动进程 ProcessBuilder 支持链式编程来配置子进程的相关设置 re ...
最新文章
- 【Qt】QMainWindow最大化按钮是灰色(不能最大化)的解决方法
- uva 11732 - strcmp() Anyone? 不错的Trie题
- WCF跨域 这可能是由于试图以跨域方式访问服务而又没有正确的跨域策略,或策略不适用于 SOAP...
- 如何将EDM营销与多渠道推广方式相结合
- 安装的python没有菜单栏_由非root用户安装python包/工具
- 火狐与IE兼容性总结(一)
- Rust: codewars的DNA to RNA Conversion
- 微电子专业深度盘点:哪所大学芯片最强?强在哪?(第2弹)
- PUN☀️四、服务器大厅建房解析
- RANSAC算法筛选匹配点
- android qq钱包接入,QQ
- 阿里云携手开源中国众包平台发布百万悬赏项目
- Android获取设备的IP地址的两种方法
- 爬虫基础_01——正则
- bootstrap的datetimepicker使用(1.将默认的英文设置为中文2.选择日月年的时候记录之前的操作)...
- RedHat(RHEL)6.2 X64 Oracle11g X64 安装参考文档
- 工业相机参数之帧率相关知识详解:
- python3使用opencv读取raw格式图片并保存为bmp格式图片
- 将一个文件下的所有的TXT文件内容提取出来合并成一个TXT文件
- bzoj 2121 字符串游戏
热门文章
- jquery 获取easyui combobox选中的值
- JAVA UDP网络编程学习笔记
- HDU-1518 Square dfs+剪枝
- 服务器改家用系统吗,服务器主机改家用
- 计算机社团活动丰富多彩,描写社团丰富多彩的句子
- fst java_java快速序列化库FST
- php发邮箱验证码找回密码,织梦dede会员通过邮箱找回密码方法
- 餐饮水单打印软件_开发一款餐饮手机app系统软件什么价格?有哪些方面需要考虑?...
- python pool_派松水潭(Python Pool)
- java转换为字符串_java – 如何从int转换为字符串?