共享記憶體是兩個程序之間最快的也是最有用的通訊方式。
由於之前我們所介紹的通訊方式都要進過核心和自己的使用者空間之間進行傳遞,而共享記憶體則是程序直接把記憶體對映到自己程序的位址空間內,所以a程序和b程序可直接看到對方對這塊區域所進行的操作。
由於程序可以直接讀寫記憶體,並不需要任何的資料的拷貝,這一點和前面所介紹的程序間的通訊就不一樣,所以它的效率很高,換句話說,程序不再通過執行進入核心的系統呼叫來傳遞彼此的資料。
和介紹之前的程序間通訊一樣,我們來看下下面共享記憶體的結構。
struct shmid_ds ;
shmget函式用來建立共享記憶體。
int shmget(key_t key, size_t size, int shm***);
返回值
成功返回乙個非負的整數,即該共享記憶體的識別符號,失敗返回-1
將共享記憶體掛在自己的位址空間上
void *shmat(int shmid, const
void *shmaddr, int shm***);
我們需要注意的是共享記憶體的刪除是沒有人對映的時候才可以刪除,他和訊息佇列不一樣,有人對映的時候是無法刪除。
將不用的共享記憶體從自己的位址空間刪除。
int shmdt(const
void *shmaddr);
shmctl用來控制共享記憶體。
nt shmctl(int shmid, int cmd, struct shmid_ds *buf);
返回值
成功返回0,失敗返回-1
cmd有以下三個命令可供選擇,這個和訊息佇列的ctl操作很類似
直接讀自己的程序空間,因為此時記憶體對映到了程序位址空間內。
Linux程序間通訊 共享記憶體
共享記憶體是執行在同一臺機器上的程序間通訊最快的方式,因為資料不需要在不同的程序間複製。通常由乙個程序建立一塊共享記憶體區,其餘程序對這塊記憶體區進行讀寫。共享記憶體往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。首先要用的函式是shmget,它獲得乙個共享儲存識別符號。i nclu...
Linux程序間共享記憶體通訊
使用共享記憶體基本分四個步驟 獲得共享記憶體 shmget 對映共享記憶體shmat 解除對映shmdt 刪除共享記憶體shmctl 於是自己在網上找來了乙個例子看了下,並且用虛擬機器單獨跑了下共享記憶體的經典例程看了下,才知道了自己的問題出現 了 發現有時候只要自己親自將程式一步一步的去測,才知道...
Linux程序間通訊 共享記憶體
之前提到了程序間通訊的管道,訊息佇列,訊號量,然後其中訊號量是pv操作,操控的是乙個共享資源。在我們提到的ipc模組中,訊息佇列針對的是資料單元的資訊傳送,管道不屬於system v ipc的部分,所以按照乙個作業系統的整體來說,他應該也有著乙個關於位元組流的訊息傳輸,並且要比之前都要快,還要跟我們...