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

2021-10-16 17:01:09 字數 3497 閱讀 3437

** adorable_

共享記憶體

共享記憶體是lunix系統中最底層的通訊機制,也是最快的通訊機制。共享記憶體通過兩個或多個程序共享同一塊記憶體區域來實現程序間的通訊,就如同 malloc() 函式向不同程序返回了指向同乙個物理記憶體區域的指標。通常是由乙個程序建立一塊共享記憶體區域,然後多個程序可以對其進行訪問,乙個程序將要傳出的資料存放到共享記憶體中,另乙個或多個程序則直接從共享記憶體中讀取資料。因此這種通訊方式是最高效的程序間通訊方式。但實際的問題在於,當兩個或多個程序使用共享記憶體進行通訊時,同步問題的解決顯得尤為重要,否則就會造成因不同程序同時讀寫一塊共享記憶體中的資料而發生混亂。在通常的情況下,通過使用訊號量來實現程序的同步。

共享記憶體函式

1、shmget函式功能:⽤來建立共享記憶體

原型:

int shmget(key_t key, size_t size, int shm***);
引數:key:這個共享記憶體段名字

size:共享記憶體⼤⼩

shm***:由九個許可權標誌構成,它們的⽤法和建立⽂件時使⽤的mode模式標誌是⼀樣的

返回值:成功返回⼀個⾮負整數,即該共享記憶體段的標識碼;失敗返回-1

注意:只有建立許可權是0666的才可以用命令列」ipcs -m」檢視,其他型別許可權的共享記憶體區無法被這個命令所檢視。

2、shmctl函式

功能:⽤於控制共享記憶體

原型:

int shmctl(int shmid, int cmd, struct shmid_ds *buf);
引數:shmid:由shmget返回的共享記憶體標識碼

cmd:將要採取的動作(有三個可取值)

ipc_ stat:把shmid_ ds結構中的資料設定為共享記憶體的當前關聯值,即用共享記憶體的當前關聯值覆蓋shmid_ds的值

ipc_ set:在程序有足夠許可權的前提下,把共享記憶體的當前關聯值設定為shmid_ds資料結構中給出的值

ipc_rmid:刪除共享記憶體段

buf:指向⼀個儲存著共享記憶體的模式狀態和訪問許可權的資料結構

返回值:成功返回0;失敗返回-1

3、shmat函式

void *shmat(int shmid, const void *shmaddr, int shm***);
引數:shmid:共享記憶體標識

shmaddr:指定連線的位址

shm***:它的兩個可能取值是shm_ rnd和shm_rdonly

返回值:成功返回⼀個指標,指向共享記憶體第⼀個節;失敗返回-1

4、shmdt函式

功能:將共享記憶體段與當前程序脫離

原型:

int shmdt(const void *shmaddr);
引數:shmaddr:由shmat所返回的指標

返回值:成功返回0;失敗返回-1

注意:將共享記憶體段與當前程序脫離不等於刪除共享記憶體段

共享記憶體特點

可以應用於任何程序

既能讀又能寫,雙向通訊

可按照隨機訪問來運算元據

沒有同步和互斥機制

生命週期隨核心

共享記憶體實現程序間通訊

以下兩個程式是乙個程序間通訊的例子。這兩個程式分別在不同的程序中執行,使用了共享記憶體進行通訊。client讀入資料,存放在共享記憶體中。server則從共享記憶體中讀取資料,顯示到螢幕上。

common.c

#include "common.h"

#include int shmcommon(int size, int flags)

int shmid = shmget(key, size, flags);

if(shmid < 0)

return shmid;

}int shmcreate(int size)

int shmopen()

int shmdestroy(int shmid)

return 0;

}//以下是測試**

///#if 0

void testcreate()

void testopen()

void testdestroy()

int main()

#endif

建立之後:

銷毀之後:

//把物理記憶體關聯(掛接,attach)到某個程序的虛擬位址空間之中

char* addr = shmat(shmid, null, 0);

sleep(2);

int i = 0;

while(i < 26)

//將共享記憶體與當前程序脫離

詳細**請參考git

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

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

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

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

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

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