Linux系統程式設計 —共享記憶體之mmap
阿新 • • 發佈:2020-10-08
**共享記憶體概念**
共享記憶體是通訊效率最高的IPC方式,因為程序可以直接讀寫記憶體,而無需進行資料的拷備。但是它沒有自帶同步機制,需要配合訊號量等方式來進行同步。
共享記憶體被建立以後,同一塊實體記憶體被對映到了多個程序地址空間,當有一個程序修改了共享記憶體的資料,其餘的程序均可看見所修改的內容,反之亦然。
![img](https://img2020.cnblogs.com/other/1218435/202010/1218435-20201008193751887-1677553019.webp)
**mmap函式**
**函式原型:**
void *mmap(void *adrr, size_t length, int prot, int flags, int fd, off_t offset);
**返回值:**
成功:返回建立的對映區首地址;
失敗:返回MAP_FAILED
**具體引數含義:**
**addr:**指向對映區的首地址,這是由系統核心所決定的,一般設為NULL;
**length:**欲建立的對映區大小;
**prot:**對映區的許可權,一般有如下幾種:
**PROT_EXEC** 對映區域可被執行
**PROT_READ** 對映區域可被讀取
**PROT_WRITE** 對映區域可被寫入
**PROT_NONE** 對映區域不能存取
**flags:**指對映區的標誌位,MAP_FIXED與MAP_PRIVATE必須選擇一個:
**MAP_FIXED:**對對映區所作的修改會反映到物理裝置,但需要呼叫msync()或者munmap();
**MAP_PRIVATE:**對對映區所作的修改不會反映到物理裝置。
**fd:**建立的對映區的檔案描述符;
**offset:**被對映檔案的偏移量,一般設為0,表示從頭開始對映。
**mumap函式**
**函式原型:**
int munmap(void *addr, size_t length);
**函式作用:**
如同malloc之後需要free一樣,mmap呼叫建立的對映區使用完畢之後,需要呼叫munmap去釋放。
**例程**
寫程序:
```
1#