POSIX 共享記憶體
與共享檔案對映的區別
POSIX 共享記憶體能夠讓無關程序共享一個對映區域而無需建立一個相應的對映檔案
- POSIX共享記憶體主要用於 程序間通訊
- 共享檔案對映主要用於 磁碟檔案IO
建立共享記憶體物件
int shm_open(const char *name, int oflag, mode_t mode);
shm_open()函式建立和開啟一個新的共享記憶體物件或開啟一個既有物件
與open()
呼叫類似
共享記憶體物件的使用
-
使用
shm_open()
函式建立或開啟一個共享記憶體物件(與檔案描述符的使用類似) -
一個新共享記憶體物件被建立時其初始長度會被設定為0。這意味著在建立完一個新共享記憶體物件之後通常在呼叫
mmap()
之前需要呼叫ftruncate()
來設定物件的大小 -
將檔案描述符傳入
mmap()
並在其flags引數中指MAP_SHARED
。這會 將共享記憶體物件對映進程序的虛擬地址空間 -
一旦對映了物件之後就能夠關閉該檔案描述符而不會影響到這個對映(關閉後會影響後續的操作)
-
使用
ftruncate()
來根據需求 擴大或收縮 共享記憶體物件(擴大時,新增的位元組初始化為0)
// 使用的框架
int fd = shm_open(name, oflgs, mode); // 名字必須斜線開頭,/demo_shm
ftruncate(fd, len); // 擴充套件共享記憶體物件的大小,為mmap做準備
void *addr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHAERD, fd, 0); // 程序間的通訊,可以透過對這塊共享記憶體對映的讀寫實現
close(fd); // 關閉檔案描述符,後續可以用 addr 操作
// 待程序間通訊結束後,刪除共享記憶體物件,刪除共享檔案對映
刪除共享記憶體物件
POSIX共享記憶體物件至少具備核心永續性,即它們會持續存在直到被顯式刪除或系統重啟。當不再需要一個共享記憶體物件時就應該使用shm_unlink()刪除它
int shm_unlink(const char *name);