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的部分,所以按照乙個作業系統的整體來說,他應該也有著乙個關於位元組流的訊息傳輸,並且要比之前都要快,還要跟我們...