程序間通訊之記憶體對映(mmap記憶體對映)
阿新 • • 發佈:2018-12-31
讀資料端程序
//mmanp_r.c #include<stdio.h> #include<fcntl.h> #include<stdlib.h> #include<sys/mman.h> #include<unistd.h> #include<sys/stat.h> #define len 0x1000 int main() { int fd; fd=open("cmmap",O_RDWR); char *addr = mmap(NULL,len,PROT_WRITE|PROT_READ,MAP_SHARED,fd,0); if(MAP_FAILED == addr) { exit(1); } close(fd); while(1) { printf("%s\n",addr); sleep(1); } close(fd); munmap(addr,len); return 0; }
寫資料端程序
//mmap_w.c #include<stdio.h> #include<fcntl.h> #include<stdlib.h> #include<sys/mman.h> #include<unistd.h> #include<sys/stat.h> #define len 4096 int main() { int fd; if(access("cmmap",F_OK)) { fd=open("cmmap",O_RDWR|O_CREAT|O_TRUNC,0777); } else { fd=open("cmmap",O_RDWR); } lseek(fd,len-1,SEEK_SET); write(fd,"\0",1); char *addr = mmap(NULL,len,PROT_WRITE|PROT_READ,MAP_SHARED,fd,0); if(MAP_FAILED == addr) { exit(1); } int i =0; while(1) { sprintf(addr,"hello world,%d",i++); sleep(1); printf("hello world"); } close(fd); munmap(addr,len); return 0; }
mmap記憶體對映顧名思義是通過將磁碟檔案以shared的形式對映到記憶體中,然後通過向該段記憶體寫入資料和讀取資料來實現程序間的通訊,mmap函式的定義如下mmap(void, off_t offset); addr是要地址,len是對映的檔案長度,port是對映對分配的pages的操作許可權,flags是描述對映物件的型別。mmap相比於write和read對檔案操作要快的多,檔案的讀寫都是先到page cache中儲存,然後再緩衝到磁碟檔案,mmap直接操作記憶體page頁。不需要頻繁的讀取檔案。所以要快的多。
注意。mmap對映區域大小必須是物理頁大小(page_size)的整倍數(32位系統中通常是4k位元組),並且使用完以後應當使用munmap釋放對映段,否則將會造成記憶體洩漏。mmap函式的呼叫失敗的情況很多。比如內部不夠時,檔案讀寫許可權與對映引數不匹配等,呼叫的時候應當加以注意。
原創。如有錯漏歡迎指出