由於在操作系統層面,各個進程所看到的虛擬地址空間是獨立的,之間沒有交集。因此需要通過中間一個關聯將多個關聯進程的不同虛擬地址映射到相同的物理地址空間中。
MMAP 就是這麼一個功能,它把一個文件(也就是在內存中的物理地址空間確定)映射到不同進程的地址空間中。
一、寫
值得注意的是由於MMAP需要內存中的物理地址空間,因此在寫操作過程中需要將文件加載到內存中才能進行操作,因此在打開文件後需要進行寫操作,引起缺頁異常,將文件映射到內存中。
fd = open(argv[1],O_CREAT|O_RDWR|O_TRUNC,00777);
lseek(fd, 4, SEEK_SET);<span style="color:#ff0000;">//這裡size最好為共享的結構體的大小,將整個需要的大小都加載到內存中
</span>write(fd,"",1);
p_mmap = (int *) mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd , 0);
close(fd);
*(p_mmap) =1;
如果不進行寫空操作便直接進行mmap映射,便會造成段錯誤,因為實際的fd對應的物理內存不存在。
二、讀
讀進程必須在寫進程之後調用mmap,否者會出現段錯誤,和前面一樣的道理。
讀進程流程
fd= open(argv[1], O_CREAT |O_RDWR, 0077);
p_mmap = (int *) mmap (NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
printf("data: %d \n", (*(p_mmap)));
摘自 保福寺計算機的專欄