mmap父子进程间通信
父子等有血緣關(guān)系的進程之間也可以通過mmap建立的映射區(qū)來完成數(shù)據(jù)通信。但相應(yīng)的要在創(chuàng)建映射區(qū)的時候指定對應(yīng)的標志位參數(shù)flags:MAP_PRIVATE:(私有映射)父子進程各自獨占映射區(qū);MAP_SHARED:(共享映射)父子進程共享映射區(qū)。
?
//父進程創(chuàng)建映射區(qū),然后fork子進程,子進程修改映射區(qū)內(nèi)容,而后,父進程讀取映射區(qū)內(nèi)容,查驗是否共享。
#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"); //刪除臨時文件目錄項,使之具備被釋放條件,該文件沒有存在的必要,僅用于完成映射區(qū),來用于父子進程間通信,因此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); //映射區(qū)建立完畢,即可關(guān)閉文件pid = fork(); //創(chuàng)建子進程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); //釋放映射區(qū)if (ret == -1) {perror("munmap error");exit(1);}}return 0; }[root@localhost mmap]# ./fork_mmap? //參數(shù)指定為MAP_PRIVATE,能通信
child, *p = 2000, var = 1000
parent, *p = 0, var = 100 ?//0是隨機值,對于沒有初始化的指針,其指向的內(nèi)容是不確定的
?
[root@localhost mmap]# ./fork_mmap ?//參數(shù)指定為MAP_SHARED,不能通信
?
child, *p = 2000, var = 1000
parent, *p =2000, var = 100
?
結(jié)論:父子進程共享:1. 打開的文件;2. mmap建立的映射區(qū)(但必須要使用MAP_SHARED)。
總結(jié)
以上是生活随笔為你收集整理的mmap父子进程间通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LOL现在牛头W出去还会自动A吗?
- 下一篇: 匿名映射