Linux 程序間通訊之共享記憶體方式

2021-07-25 16:06:42 字數 1796 閱讀 3018

共享記憶體方式:從物理記憶體裡面拿出來一部分作為多個程序共享。

共享記憶體是程序間共享資料的一種最快的方法,乙個程序向共享記憶體區域寫入資料,共享這個記憶體的所有程序都可以立即看到其中內容。

共享記憶體實現步驟:

一、建立共享記憶體,使用

shmget

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

shmat

函式。建立共享記憶體shmget:

intshmget(key_t key, size_t size, int shm***)

功能:得到乙個共享記憶體識別符號或建立乙個共享記憶體物件並返回共享記憶體識別符號。

key:0(ipc_private)

會建立共享記憶體物件

size:大於

0的整數,新建共享記憶體的大小,以位元組為單位。只獲取共享記憶體時,指定為

0.shm***:

0表示取共享記憶體識別符號,如不存在則函式會報錯;

ipc_creat,如果核心中不存在鍵值與

key相等的共享記憶體時,則建立乙個共享記憶體;如果存在這樣的共享記憶體則返回共享記憶體的識別符號;

ipc_creat|ipc_excl:如果核心中不存在鍵值與

key相等的共享記憶體,則新建乙個訊息佇列;如果存在這樣的共享記憶體則報錯;

函式返回值:成功則返回記憶體的識別符號;出錯則返回

-1,錯誤原因存在於

error

對映共享記憶體到呼叫程序的位址空間shmat:

void*shmat(int shmid, const void *shmaddr, int shm***)

msqid:共享記憶體識別符號

shmaddr:指定共享記憶體出現在程序記憶體位址的什麼位置,直接指定為

null

讓核心自己決定乙個合適的位址位置。

shm***:shm_rdonly

唯讀模式,其他為讀寫模式

函式返回值:-1

,錯誤原因存在於

error

斷開共享記憶體連線shmdt:

intshmdt(const void *shmaddr)

功能:傳入

shmaddr

,連線共享的記憶體起始位址;斷開成功則返回

0,出錯則返回-1,

錯誤原因存在於

error

中。父子程序間通訊例項:

#include

#include

#include

#include

#include

#include

int main(int argc, char **argv)

intshmid;

shmid= shmget(0,1024,ipc_creat);

if(shmid== -1)

if(fork())

else

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

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

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

1.什麼是共享記憶體?2.共享記憶體優缺點 優點 採用共享記憶體的乙份好處是效率高,因為程序可以直接讀寫空間,不需要資料拷貝,而訊息佇列與管道都經過了2次拷貝,寫端寫的時候往佇列拷貝乙份,讀端讀的時候又拷貝了乙份。缺點 以前的程序間通訊都自帶同步互斥機制,但共享記憶體並沒有,需要自己加鎖。3.實現 ...

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

共享記憶體可以說是最有用的程序間通訊方式,也是最快的ipc形式。兩個不同程序a b共享記憶體的意思是,同一塊物理記憶體被對映到程序a b各自的程序位址空間。程序a可以即時看到程序b對共享記憶體中資料的更新,反之亦然。由於多個程序共享同一塊記憶體區域,必然需要某種同步機制,互斥鎖和訊號量都可以。採用共...