7 linux程序間通訊之共享記憶體

2021-06-03 18:25:26 字數 1702 閱讀 1432

共享記憶體

共享記憶體是被多個程序共享的一部分物理記憶體。共享記憶體是程序間共享資料的一種最快的方法,乙個程序向共享記憶體區域寫入了資料,共享這個記憶體的區域的所有程序就可以立刻看到其中的內容。

共享記憶體實現可以分為兩個步驟

ø         建立共享記憶體,使用shmget函式

ø對映共享記憶體,將這段建立的共享記憶體對映到具體的程序空間去,使用shmat函式

建立

int shmget (key_t key,int size,int shm***)

key標識共享記憶體的鍵值:o/ipc_private。當key懂得取值為ipc_private,則函式shmget()將建立一塊新的共享記憶體;如果key的取值為0,而引數shm***中又設定ipc_private這個標誌,則同樣會建立一塊新的共享記憶體。

返回值:成功,返回共享記憶體識別符號(ip)。失敗返回-1.

økey= ipc_private

økey=0,shm***= ipc_private

其中乙個成立就建立新記憶體

對映

int shmat (int shmid, char *shmaddr, int flag)

引數:øshmid:shmget函式返回的共享記憶體識別符號(ip).

ø         flag:決定以什麼方式來決定對映的位址(通常為0)

øshmaddr這個位址可以自己指定,但當shmaddr=0表示由系統自動分配乙個位址

返回值:成功,返回共享記憶體對映到程序中的位址,失敗,-1。

當乙個程序不再需要共享記憶體時,需要把它從程序位址空間中解脫。

int shmdt (char *shmaddr)

例題:shmem.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define perm s_irusr|s_iwusr

/* 共享記憶體 */

int main(int argc,char **argv)

/* 建立共享記憶體 */  

if((shmid=shmget(ipc_private,1024,perm))==-1)

/* 建立子程序 */

if(fork()) // 父程序寫

else       // 子程序讀 }

執行:

# ./shmem 1234

# client get 1234

Ubuntu下Linux程序間通訊 共享記憶體

linux提供了多種程序間通訊的方法,常見有管道 匿名 fifo 有名管道 訊息佇列 訊號量 共享記憶體,socket通訊。linux程序間通訊 匿名管道 linux程序間通訊 fifo 有名管道 linux程序間通訊 訊息佇列 linux程序間通訊 訊號量 linux程序間通訊 共享記憶體 5.共...

Linux高階程式設計基礎 程序間通訊之共享記憶體

建立共享記憶體,寫程序每隔2秒向記憶體寫入一次 hello world 如果結束寫操作,則寫程序寫入 end 讀程序從共享記憶體讀取資料,並列印。直到讀到 end 為止。這是寫程序 include include include include include include include inc...

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

共享記憶體塊提供了在任意數量的程序之間進行高效雙向通訊的機制。每個使用者都可以讀取寫入資料,但是所有程式之間必須達成並遵守一定的協議,以防止諸如在讀取資訊之前覆寫記憶體空間等競爭狀態的出現。不幸的是,linux無法嚴格保證提供對共享記憶體塊的獨佔訪問,甚至是在您通過使用ipc private建立新的...