Linux系統程式設計之mmap實現父子程序通訊
阿新 • • 發佈:2021-03-10
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