1. 程式人生 > 其它 >Linux系統程式設計之mmap實現父子程序通訊

Linux系統程式設計之mmap實現父子程序通訊

Linux系統程式設計之mmap實現父子程序通訊

原理:
在映射了對映區之後,父子都可以拿到對映的記憶體區域的記憶體地址,如果一個程序改變了記憶體區域的內容,另外一個去讀的時候會有變化。

所以,應該先建立對映區再fork。

#include<stdio.h>
#include<unistd.h>
#include<sys/typrs.h>
#include<sys/stat.h>
#include<sys/mman.h>
#include<fcntl.h>
#include<sys/wait.h>

int main(
0 { //開啟檔案 int fd =open("mem.txt",O_RDWR); int *mem=mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_SHRES,0); if(mem==MAP_FAILD) { perror("mmap err"); return -1; } //fork子程序 pid_t pid =fork(); //父子程序交替修改資料 if(pid==0) { //son *mem=100; printf("child,*mem=%d\n"
,*mem); sleep(3); printf("child,*mem=%d\n",*mem); } else if(pid>0) { //parent sleep(1);; printf("parent,*mem=%d\n",*mem); *mem=1001; printf("parent,*mem=%d\n",*mem); wait(NULL); } munmap(mem,4); close(fd); return
0; }

輸出

在這裡插入圖片描述
注意:mem.txt作用僅僅是開啟一個檔案。

結論:父子程序共享:1、開啟檔案,2、mmap建立對映區(但是必須使用MAP_SHARED)

如果MAP_SHARED改位MAP_PRIVATE時,父程序沒有讀到子程序的資料,子程序也沒有督導父程序的資料,結果如圖所示

在這裡插入圖片描述
所以程序要通訊的話,flags必須設為MAP_SHARED