shm(共享記憶體API)

2021-10-04 17:04:27 字數 2305 閱讀 8250

shm(共享記憶體api)

1、共享記憶體的特點:

(1)減少進入核心空間的次數;

(2)直接使用位址來讀寫快取時,效率會更高,適用於大資料量的通訊。

2、共享記憶體的使用步驟:

(1)程序呼叫shmget函式,建立新的或獲取已有共享記憶體;

(2)程序呼叫shmat函式,將物理記憶體對映到自己的程序空間;

(3)程序呼叫shmdt函式,取消共享記憶體的對映;

(4)程序呼叫shmctl函式,釋放開闢的那片物理記憶體空間(刪除)。

1、shmget(建立/獲取共享記憶體)

1、標頭檔案:#include

2、函式原型:int shmget(key_t key, size_t size, int shm***);

3、函式形參:key:用於為共享記憶體生成唯一的共享記憶體id(識別符號);

size:指定共享記憶體的大小;

shm***:指定建立時的原始許可權,一般都設定為0664|ipc_creat。

注:(1)key有三種設定:(msgget)

① ipc_private:指定後每次呼叫shmget時都會建立乙個新的共享記憶體;

②使用ftok函式,通過路徑名和乙個8位的整形數來生成key值;

注:ftok函式標頭檔案:#include #include

函式原型:key_t ftok(const char *pathname, int proj_id);

proj_id一般指定為乙個ascii碼值,如』a』。

③自己指定乙個長整型數。

(2)要求size是虛擬頁大小的整數倍(一般來說虛擬頁大小是4k(4096位元組))。

(3)shmget只有在建立乙個新的共享記憶體時才會用到,否者不會用到。

4、函式返回值:成功返回共享記憶體識別符號以便後續操作,失敗返回-1,錯誤存於erron中。

5、使用示例:

(1)使用ftok函式生成key

key_t key = ftok("/tmp/shm",『a』); //生成乙個隨機數配置

int shmid = shmget(key, max_size, 0644);

(2)使用ipc_private

int shmid = shmget(ipc_private, max_size, 0644);

2、shmat(對映共享記憶體)

1、標頭檔案:#include

2、函式原型:void *shmat(int shmid, const void *shmaddr, int shm***);

3、函式形參:shmid:共享記憶體識別符號;

shmaddr:指定對映的起始位址(通常使用null);

shm***:指定對映條件。

注:(1)shmaddr有兩種設定方式:

①null:表示由核心自己來選擇對映的起始位址(虛擬位址);

②自己指定對映的起始位址(虛擬位址)。

(2)shm***條件(許可權)設定:

①0:以可讀可寫的方式對映共享記憶體;

②shm_rdonly:以唯讀方式對映共享記憶體。

4、函式返回值:成功返回對映位址,失敗返回-1,錯誤存於erron中。

5、使用示例:char *addr = (char *)shmat(shmid, null, 0);

3、shmdt(取消建立的對映)

1、標頭檔案:#include #include

2、函式原型:int shmdt(const void *shmaddr);

3、函式形參:shmaddr:對映的起始位址(虛擬位址)。

注:shmaddr具體見shmat。

4、函式返回值:成功返回0,失敗返回-1,錯誤存於erron中。

5、使用示例:shmdt(addr); //對映的起始位址,形成於shmat

4、shmctl(控制共享記憶體)

1、標頭檔案:#include

2、函式原型:int shmctl(int shmid, int cmd, struct shmid_ds *buf);

3、函式形參:shmid:共享記憶體識別符號;

cmd:控制選項;

buf:存放屬性資訊(控制為刪除時,設定為null即可)

注:cmd選項:

① ipc_stat:從核心獲取共享記憶體屬性資訊,讀到第三個引數(應用快取)。

②ipc_set:修改共享記憶體的屬性(修改方法與訊息佇列相同)。

③ipc_rmid:刪除共享記憶體(前提:所有的對映全部取消)。

4、控制功能:獲取共享記憶體的屬性資訊、修改共享記憶體的屬性資訊、刪除共享記憶體等。

5、使用示例:shmctl(shmid,ipc_rmid,null); //刪除共享記憶體

程序間通訊之共享記憶體 shm

include include include struct shm共享記憶體使用的結構體的宣告 int main int argc,const char argv shmid shmget key,sizeof struct shm ipc creat ipc excl 0666 共享記憶體的獲取...

docker複製相關,調整shm共享記憶體

docker中執行selenium的自動化,啟動之後報頁面崩潰失敗,網上查說是shm記憶體不夠導致,df h命令檢視shm記憶體才64m,啟動一次瀏覽器不關閉就占用超過50 檢視了伺服器上的所有docker的shm都是64m,可能後端服務不需要用到shm。網上找了一些命令未能處理掉這個問題 不管是d...

linux儲存 共享記憶體機制shm(十三)

實現程序間通訊最簡單也是最直接的方法就是共享記憶體 為參與通訊的多個程序在記憶體中開闢乙個共享區。由於程序可以直接對共享記憶體進行讀寫操作,因此這種通訊方式效率特別高,但其弱點是,它沒有互斥機制,需要訊號量之類的手段來配合。共享記憶體,顧名思義,就是兩個或多個程序都可以訪問的同一塊記憶體空間,乙個程...