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)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/385341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

匿名映射

通过使用我们发现&#xff0c;使用映射区来完成文件读写操作十分方便&#xff0c;父子进程间通信也较容易。但缺陷是&#xff0c;每次创建映射区一定要依赖一个文件才能实现。通常为了建立映射区要open一个temp文件&#xff0c;创建好了再unlink、close掉&#xff0c;比较麻烦。…

mmap无血缘关系进程间通信

实质上mmap是内核借助文件帮我们创建了一个映射区&#xff0c;多个进程之间利用该映射区完成数据传递。由于内核空间多进程共享&#xff0c;因此无血缘关系的进程间也可以使用mmap来完成通信。只要设置相应的标志位参数flags即可。若想实现共享&#xff0c;当然应该使用MAP_SHA…

【C++ Primer | 13】课后习题答案

文章目录13.1.4节目练习13.2节练习13.2.2练习13.1.4节目练习 练习13.14 #include <iostream> using namespace std;class numbered { private: static int seq; public:numbered() { mysn seq; }int mysn; };int numbered::seq 0;void f(numbered s) { cout <…

信号的概念与机制

信号的共性&#xff1a;1. 简单&#xff08;开销小&#xff0c;且在用或者不用的情况下&#xff0c;开销是一样的&#xff09;&#xff1b;2. 不能携带大量信息&#xff08;如程序执行过程中&#xff0c;出现段错误时&#xff0c; 就会发送一个相关的信号&#xff08;编号为11&…

信号的产生和状态

信号的产生&#xff1a;1.按键产生&#xff0c;如&#xff1a;Ctrlc&#xff08;内核向进程发送信号&#xff0c;杀死该进程&#xff09;、Ctrlz、Ctrl\&#xff1b;2.系统调用产生&#xff0c;如&#xff1a;kill、raise、abort&#xff1b;3.软件条件产生&#xff0c;如&…

【C++ Priemr | 15】虚函数常见问题

1. 在成员函数中调用虚函数&#xff1a; #include <iostream> using namespace std; class CBase { public:void func1(){func2();}virtual void func2() { cout << "CBase::func2()" << endl; } }; class CDerived : public CBase { public:virt…

965. 单值二叉树

如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时&#xff0c;才返回 true&#xff1b;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;[1,1,1,1,1,null,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#…

信号四要素

与变量三要素&#xff08;类型、名字、值&#xff09;类似的&#xff0c;每个信号也有其必备4要素&#xff0c;分别是&#xff1a;1.编号&#xff1b;2.名称&#xff08;即编号的宏定义&#xff09; &#xff1b;3.事件&#xff08;引起信号产生的事件&#xff0c;如段错误&…

958. 二叉树的完全性检验

给定一个二叉树&#xff0c;确定它是否是一个完全二叉树。 百度百科中对完全二叉树的定义如下&#xff1a; 若设二叉树的深度为 h&#xff0c;除第 h 层外&#xff0c;其它各层 (1&#xff5e;h-1) 的结点数都达到最大个数&#xff0c;第 h 层所有的结点都连续集中在最左边&a…

信号的产生

&#xff08;1&#xff09;终端按键产生信号&#xff08;与终端交互的进程&#xff09; Ctrl c → 2) SIGINT&#xff08;终止/中断&#xff09; "INT" ----Interrupt Ctrl z → 20) SIGTSTP&#xff08;暂停/停止&#xff09; "T" ----Termin…

897. 递增顺序查找树

给定一个树&#xff0c;按中序遍历重新排列树&#xff0c;使树中最左边的结点现在是树的根&#xff0c;并且每个结点没有左子结点&#xff0c;只有一个右子结点。 示例 &#xff1a; 输入&#xff1a;[5,3,6,2,4,null,8,1,null,null,null,7,9]5/ \3 6/ \ \2 4 8/ …

信号集操作函数

内核通过读取未决信号集来判断信号是否应被处理。信号屏蔽字mask可以影响未决信号集。而我们可以在应用程序中自定义set来改变mask。已达到屏蔽指定信号的目的。综上&#xff1a;自定义信号集set&#xff08;也为一个字&#xff0c;64位&#xff09;通过信号集操作函数来改变信…

信号捕捉(signal、sigaction)

信号的基本属性&#xff1a;软中断&#xff0c;由内核发送&#xff0c;内核处理。某个进程通过内核向另一个进程发送信号时&#xff08;引起信号产生的五个因素&#xff09;&#xff0c;另一个进程将会陷入内核进行中断处理&#xff0c;未决信号集中相应信号置1&#xff0c;当递…

1090 Highest Price in Supply Chain (25)(25 分)

A supply chain is a network of retailers&#xff08;零售商&#xff09;, distributors&#xff08;经销商&#xff09;, and suppliers&#xff08;供应商&#xff09;-- everyone involved in moving a product from supplier to customer. Starting from one root suppli…

时序竞态(竞态条件)

产生原因&#xff1a;仍然以前文实现的sleep函数为例&#xff0c;如果进程在执行完alarm函数后&#xff0c;突然失去CPU&#xff0c;被阻塞等待&#xff08;这是有可能的&#xff0c;进程在执行过程中&#xff0c;若非原子操作&#xff0c;都有可能随时失去CPU&#xff09;&…

1106 Lowest Price in Supply Chain (25)

A supply chain is a network of retailers&#xff08;零售商&#xff09;, distributors&#xff08;经销商&#xff09;, and suppliers&#xff08;供应商&#xff09;-- everyone involved in moving a product from supplier to customer. Starting from one root suppli…

【Leetcode | 顺序刷题 】二分查找目录

二分查找序号题号129. 两数相除 50. Pow(x, n) 69. x 的平方根

sigsuspend函数(mysleep函数的改进)

可以通过设置屏蔽SIGALRM的方法来控制程序执行逻辑&#xff0c;但无论如何设置&#xff0c;程序都有可能在“解除信号屏蔽”与“挂起等待信号”这个两个操作间隙失去cpu资源。除非将这两步骤合并成一个“原子操作”。sigsuspend函数具备这个功能。在对时序要求严格的场合下都应…

【Leetcode | 顺序刷题】数学目录

序号题号1 7. 整数反转 28. 字符串转换整数 (atoi)39. 回文数443. 字符串相乘

全局变量的异步I/O问题

全局变量的异步I/O问题同样属于时序竞态问题&#xff0c;其本质就是多个进程或者同一个进程中的多个时序&#xff08;如主控程序和信号捕捉时的用户处理函数&#xff09;对同一个变量进行修改时&#xff0c;它们的执行顺序不一样就会导致该变量最终的值不一样&#xff0c;从而产…