父子等有血緣關系的進程之間也可以通過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)。