1. 程式人生 > >9.程序間通訊:mmap記憶體對映區

9.程序間通訊:mmap記憶體對映區

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進行讀寫操作