引文:
個人名言:“同一條河裡淹死兩次的人,是傻子,淹死三次及三次以上的人是超人”。經曆過上次悲催的面試,決定沉下心來,好好的補充一下基礎知識點。本文是這一系列第一篇:程序間通訊之mmap。
一、概念:什麼是mmap?
通過共享存儲實作程序間通訊是一個主要的程序間通訊的方式。它包括磁盤檔案的共享和記憶體的共享,以前總是關注記憶體的共享,而忽略了磁盤檔案的共享,也就是這裡要講的mmap。mmap位址映射是linux系統提供的一種功能強大的系統調用,最典型的應用是用于顯示卡記憶體的映射。同樣,對于普通的硬碟檔案也可以進行mmap系統調用。mmap()系統調用使得程序之間通過映射同一個普通檔案實作共享記憶體。普通檔案被映射到程序位址空間後,程序可以向通路普通記憶體一樣對檔案進行通路,不必再調用read(),write()等操作。
注:實際上,mmap()系統調用并不是完全為了用于共享記憶體而設計的。它本身提供了不同于一般對普通檔案的通路方式,程序可以像讀寫記憶體一樣對普通檔案的操作。而posix或系統v的共享記憶體ipc則純粹用于共享目的,當然mmap()實作共享記憶體也是其主要應用之一。
函數原型如下所示:
#include <sys/mman.h>
void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset); //建立映射
int munmap(void *start, size_t length); //解除映射
二、參數說明:
start: 起始虛拟位址,是使用者期望使用的虛拟位址,如果程序的虛拟位址空間允許,那麼會優先使用該位址。注意:該虛拟位址必須按頁尺寸對齊。
length:映射的長度。
prot:期望的記憶體保護,注意不要和打開檔案時的屬性沖突。屬性有prot_exec、prot_read、prot_write、prot_none,分别為可執行、可讀、可寫、不可通路。
flags:指明映像對象的類型。類型有:map_fixed(隻使用指定的start虛拟位址)、map_shared(與其他程序共享該映射)、map_private(建立一個寫拷貝的映射,保持資料不影響原有檔案)。
fd: 打開的檔案句柄。
offset: 指明在檔案中的偏移,注意:偏移也必須按頁尺寸對齊。
其中最難了解的是start參數,它填入的是程式員期望使用的虛拟位址。如果該虛拟位址不沖突,那麼mmap系統調用傳回的值就應該是該虛拟位址。
三、代碼執行個體
本例是打開一個普通的檔案,對其進行mmap,然後讀取檔案内容:
四、輸出結果:建立檔案1.txt 随意輸入一些内容即可
[zhangzl@localhost mmap]$ ./ex01 1.txt
2
hello
world.