9.程序間通訊:mmap記憶體對映區
阿新 • • 發佈:2018-11-12
1.父子程序永遠共享的東西
檔案描述符
記憶體對映區
2.使用mmap[父子]程序間通訊
父子程序通訊,怎麼找到同一個mmap記憶體對映區? 答: 返回值ptr 檔案描述符fd int main(){ int len=4096; //建立匿名的記憶體對映區 //第四個引數,加上MAP_ANION:MAP_SHARED|MAP_ANON //fd指定為-1 void* ptr=mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANON,-1,0); if(ptr==MAP_FAILED){ perror("mmap"); exit(1); } pid_t pid=fork(); if(pid==-1){ perror("fork"); exit(1); } if(pid>0){ //parent strcpy((char*)ptr,"I am a student"); //向mmap中寫入資料 wait(NULL); } if(pid==0){//chile printf("%s\n",(char*)ptr); //從mmap中讀取資料 } munmap(ptr,len); return 0; } 注意: 父子程序在"read write"記憶體對映區時,是非阻塞的,因此應該控 制父子程序的read和write順序。 相比於讀寫磁碟上的檔案: mmap讀寫資料,效率更高,直接通過[指標訪問記憶體]的方式去讀寫資料。
3.使用mmap[無血緣關係]程序間通訊
父子程序通訊,怎麼找到同一個mmap記憶體對映區?
答:本地磁碟上的(相同的檔案)
1.如何通訊?
不能使用匿名對映的方式
只能藉助磁碟檔案建立對映區
2.程序A(a.c) 程序B(b.c)
a.c
int fd=open("hello");
void* ptr=mmap(.....fd.....);
對對映區ptr進行讀寫操作
b.c
int fd=open("hello");
void* ptr=mmap(.....fd.....);
對對映區ptr進行讀寫操作