linux 程序間通訊 共享記憶體

2021-09-24 17:52:35 字數 1732 閱讀 3572

linux 程序間通訊–共享記憶體:

linux共享記憶體主要的api

ftok()、shmget()、shmat()、shmdt()及shmctl()

#include

#include

key_t ftok(const char *pathname, int proj_id); 是用來生成乙個key值的。pathname是乙個檔案路徑名,proj_id是乙個id號碼

int shmget(key_t key, size_t size, int shm***); size是制定共享記憶體的大小 ipc_excl:如果key已經對應乙個段了,則shmget返回錯誤-1

void *shmat(int shm_id, const void *shm_addr, int shm_***);

第乙個引數,shm_id是由shmget()函式返回的共享記憶體標識。

第二個引數,shm_addr指定共享記憶體連線到當前程序中的位址位置,通常為空,表示讓系統來選擇共享記憶體的位址。

第三個引數,shm_***是一組標誌位,通常為0。

呼叫成功時返回乙個指向共享記憶體第乙個位元組的指標,如果呼叫失敗返回-1.

int shmdt(const void *shmaddr);

在一般的unix實現中,是將檔案的索引節點號取出,前面加上子序號得到key_t的返回值。

如指定檔案的索引節點號為65538,換算成16進製為0x010002,而你指定的id值為38,換算成16進製為0x26,則最後的key_t返回值為0x26010002。

查詢檔案索引節點號的方法是: ls -i

假設write.c和read.c在同乙個目錄下面:那麼他們得到的mykey的值是一樣的。

typedef struct share_buff

share_buff;

wirte.c:

share_buff * pbuff = null;

key_t mykey = ftok(".", 666);

int shmid = shmget(mykey, sizeof(share_buff),ipc_creat | ipc_excl);

if (shmid < 0)

handle error

pbuff = shmat(shmid, 0, 0);

if (null == pbuff)

handle error

memset(pbuff, 0, sizeof(share_buff));

while(1)

shmdt(pbuff);//脫離共享記憶體段

read.c:

int a, b, c;

share_buff * pbuff = null;

key_t mykey = ftok(".", 666);

int shmid = shmget(mykey, sizeof(share_buff),ipc_creat | ipc_excl);

if (shmid < 0)

handle error

pbuff = shmat(shmid, 0, 0);

if (null == pbuff)

handle error

memset(pbuff, 0, sizeof(share_buff));

while(1)

shmdt(pbuff); //脫離共享記憶體段

shmctl(shmid,ipc_rmid,null);//刪除共享記憶體段

Linux程序間通訊 共享記憶體

共享記憶體是執行在同一臺機器上的程序間通訊最快的方式,因為資料不需要在不同的程序間複製。通常由乙個程序建立一塊共享記憶體區,其餘程序對這塊記憶體區進行讀寫。共享記憶體往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。首先要用的函式是shmget,它獲得乙個共享儲存識別符號。i nclu...

Linux程序間共享記憶體通訊

使用共享記憶體基本分四個步驟 獲得共享記憶體 shmget 對映共享記憶體shmat 解除對映shmdt 刪除共享記憶體shmctl 於是自己在網上找來了乙個例子看了下,並且用虛擬機器單獨跑了下共享記憶體的經典例程看了下,才知道了自己的問題出現 了 發現有時候只要自己親自將程式一步一步的去測,才知道...

Linux程序間通訊 共享記憶體

之前提到了程序間通訊的管道,訊息佇列,訊號量,然後其中訊號量是pv操作,操控的是乙個共享資源。在我們提到的ipc模組中,訊息佇列針對的是資料單元的資訊傳送,管道不屬於system v ipc的部分,所以按照乙個作業系統的整體來說,他應該也有著乙個關於位元組流的訊息傳輸,並且要比之前都要快,還要跟我們...