顧名思義,共享記憶體就是兩個不相關的程序之間利用同一塊記憶體進行資料傳輸。但是由於共享記憶體並沒有提供同步機制,所以再利用共享記憶體時需要其他的機制來同步對該記憶體的訪問。常用的是訊號量。
#include
int shmget(key_t key, size_t size, int shm***);
void shmat(int shm_id, const void *shm_addr, int shmflag);
int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
int shmdt(const void *shm_addr);
其中,利用shmget函式來建立共享記憶體。返回乙個共享記憶體識別符號,該識別符號用於後續的共享記憶體函式。當第一次建立共享記憶體時,它不能被任何程序訪問,想要啟用對該記憶體的訪問,就需要利用shmat函式將其連線到該程序的位址空間上。其返回的就是該記憶體的起始位址,如果失敗會返回-1。那麼就可以根據指標來對記憶體進行操作了。
操作完成後,使用shmdt函式將記憶體分離,成功返回0,失敗返回-1。該操作只會分離程序與記憶體,並不會釋放該記憶體。
最後乙個函式是共享記憶體的控制函式shmctl。它相比於訊號量的控制函式要簡單一些。
其中,控制命令有三種,分別是ipc_stat、ipc_set和ipc_rmid。
ipc_stat是利用shmid_ds 結構獲取當前共享記憶體的狀態
ipc_set,當程序有足夠的許可權,則利用shmid_ds結構設定當前共享記憶體的狀態。
ipc_rmid就是刪除指定的共享記憶體。當然要在所有程序分離該記憶體之後,否則會發生不可控制的事情。
由於需要程序同步,所以本**包含了訊號量的內容。
訊號量的介紹:linux程序間的通訊~訊號量。
**如下
// shm1
#include#include#include#include#include#include #include "sem.h"
int main()
} shmdt(ptr);
}
// shm2
#include#include#include#include#include#include #include "sem.h"
int main()
printf("lenth = %d : %s", strlen(ptr) - 1, ptr);
sleep(2);
semv(semid, &index, 1);
} shmdt(ptr);
}
這兩段**實現了 shm1向共享記憶體中寫入資料,shm2從共享記憶體中讀出資料並且顯示的功能。涉及到了三個函式,並沒有使用shmctl函式。 Linux程序間通訊 共享記憶體
共享記憶體是執行在同一臺機器上的程序間通訊最快的方式,因為資料不需要在不同的程序間複製。通常由乙個程序建立一塊共享記憶體區,其餘程序對這塊記憶體區進行讀寫。共享記憶體往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。首先要用的函式是shmget,它獲得乙個共享儲存識別符號。i nclu...
Linux程序間共享記憶體通訊
使用共享記憶體基本分四個步驟 獲得共享記憶體 shmget 對映共享記憶體shmat 解除對映shmdt 刪除共享記憶體shmctl 於是自己在網上找來了乙個例子看了下,並且用虛擬機器單獨跑了下共享記憶體的經典例程看了下,才知道了自己的問題出現 了 發現有時候只要自己親自將程式一步一步的去測,才知道...
Linux程序間通訊 共享記憶體
之前提到了程序間通訊的管道,訊息佇列,訊號量,然後其中訊號量是pv操作,操控的是乙個共享資源。在我們提到的ipc模組中,訊息佇列針對的是資料單元的資訊傳送,管道不屬於system v ipc的部分,所以按照乙個作業系統的整體來說,他應該也有著乙個關於位元組流的訊息傳輸,並且要比之前都要快,還要跟我們...