父子等有血缘关系的进程之间也可以通过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父子进程间通信相关推荐

  1. Linux系统编程---5(共享存储映射,存储映射I/O,mmap函数,父子进程间通信,匿名映射)

    共享存储映射 文件进程间通信 使用文件也可以完成 IPC,理论依据是,fork 后,父子进程共享文件描述符.也就共享打开的文件. 编程:父子进程共享打开的文件.借助文件进行进程间通信. 测试代码 /* ...

  2. Linux的基础知识——mmap父子通信进程和匿名通信

    1.mmap父子进程通信 \qquad父子等有血缘关系的进程之间也可以通过mmap建立的映射区来完成数据通信.但相应的要在创建映射区时候指定对应的标志位参数flags: \qquadMAP_PRIVA ...

  3. Linux系统编程:mmap介绍和使用mmap实现进程间通信

    mmap函数介绍 这个函数有啥子作用?m-> memory 内存,map ->映射,见名知义,就是创建内存映射区,作用就是:将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件.所 ...

  4. Linux:进程间通信(创建匿名管道,父子进程间通信,兄弟进程间通信)

    过一遍管道的基础知识: 1.本质:存在于高速缓存区,属于伪文件,不占用磁盘空间.缓冲区大小默认4K,可根据实际情况适当调整 2.读端和写端各自对应一个文件描述符,数据从写端流入,读端流出 3.操作管道 ...

  5. 使用管道完成父子进程间通信

    什么是进程间通信         Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间.任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须 ...

  6. linux+mmap父子通信_linux库函数mmap()原理?转载

    linux库函数mmap()原理 转载 1.mmap基本概念 2.mmap内存映射原理 3.mmap和常规文件操作的区别 4.mmap优点总结 5.mmap相关函数 6.mmap使用细节 7.mmap ...

  7. Linux网络处理“零拷贝”技术mmap()内核进程间通信设计8086分页管理——摆在一起来谈谈...

    Jack:最近听说了网络处理的"零拷贝"技术,觉得非常神奇,在网上查阅了很多资料.不过,并不是太明白--知其然,而不知其所以然.你能通俗地解释一下吗? 我:这是一个相对比较复杂的话 ...

  8. python之父子进程间通信

    当进行fork的时候,父父进程的信息会复制到子进程,这本身已经是一种通信方式了,即子进程复制父进程资源,除此之外,还想让这两个进程进行通信,有什么方法呢?可以使用socketpair的方式. 我的疑惑 ...

  9. Java启动子进程以及父子进程间通信

    启动进程的方式说明 通过 new ProcessBuilder(String ...commands).start() 启动进程 ProcessBuilder 支持链式编程来配置子进程的相关设置 re ...

最新文章

  1. 【Qt】QMainWindow最大化按钮是灰色(不能最大化)的解决方法
  2. uva 11732 - strcmp() Anyone? 不错的Trie题
  3. WCF跨域 这可能是由于试图以跨域方式访问服务而又没有正确的跨域策略,或策略不适用于 SOAP...
  4. 如何将EDM营销与多渠道推广方式相结合
  5. 安装的python没有菜单栏_由非root用户安装python包/工具
  6. 火狐与IE兼容性总结(一)
  7. Rust: codewars的DNA to RNA Conversion
  8. 微电子专业深度盘点:哪所大学芯片最强?强在哪?(第2弹)
  9. PUN☀️四、服务器大厅建房解析
  10. RANSAC算法筛选匹配点
  11. android qq钱包接入,QQ
  12. 阿里云携手开源中国众包平台发布百万悬赏项目
  13. Android获取设备的IP地址的两种方法
  14. 爬虫基础_01——正则
  15. bootstrap的datetimepicker使用(1.将默认的英文设置为中文2.选择日月年的时候记录之前的操作)...
  16. RedHat(RHEL)6.2 X64 Oracle11g X64 安装参考文档
  17. 工业相机参数之帧率相关知识详解:
  18. python3使用opencv读取raw格式图片并保存为bmp格式图片
  19. 将一个文件下的所有的TXT文件内容提取出来合并成一个TXT文件
  20. bzoj 2121 字符串游戏

热门文章

  1. jquery 获取easyui combobox选中的值
  2. JAVA UDP网络编程学习笔记
  3. HDU-1518 Square dfs+剪枝
  4. 服务器改家用系统吗,服务器主机改家用
  5. 计算机社团活动丰富多彩,描写社团丰富多彩的句子
  6. fst java_java快速序列化库FST
  7. php发邮箱验证码找回密码,织梦dede会员通过邮箱找回密码方法
  8. 餐饮水单打印软件_开发一款餐饮手机app系统软件什么价格?有哪些方面需要考虑?...
  9. python pool_派松水潭(Python Pool)
  10. java转换为字符串_java – 如何从int转换为字符串?