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

2022-01-12 01:47:14 字數 1937 閱讀 1882

一,共享記憶體

核心管理一片物理記憶體,允許不同的程序同時對映,多個程序可以對映同一塊記憶體,被多個程序同時對映的物理記憶體,即共享記憶體。

對映物理記憶體叫掛接,用完以後解除對映叫脫接

1,共享記憶體的特點:

優點:是最快的ipc。

缺點:要程式設計者自己實現對共享記憶體互斥訪問。如何實現?

2,程式設計模型:具體函式的用法可以用man手冊檢視(強力推薦)

程序a: writeshm.c

1) 獲得key, ftok()

2) 使用key來建立乙個共享記憶體 shmget()

3) 對映共享記憶體(得到虛擬位址), shmat()

4) 使用共享記憶體, 往共享記憶體中寫入資料

5) 解除對映 shmdt()

6) 如果共享記憶體不再使用,可以使用shmctl()銷毀共享記憶體

程序b: readshm.c     

1) 獲得key, ftok()     

2) 使用key來獲得乙個共享記憶體 shmget()     

3) 對映共享記憶體(得到虛擬位址), shmat()     

4) 使用共享記憶體, 讀取共享記憶體中的資料     

5) 解除對映 shmdt()     

3,例項

程序a:

//

writeshm.c

#include

#include

#include

#include

#include

#include

intmain()

//對映共享記憶體,得到虛擬位址

void *p = shmat(shmid, 0, 0

);

if((void*)-1 ==p)

//寫共享記憶體

int *pp =p;

*pp = 0x12345678

; *(pp + 1) = 0xffffffff

;

//解除對映

if(-1 ==shmdt(p))

printf(

"解除對映成功,點選回車銷毀共享記憶體\n");

getchar();

//銷毀共享記憶體

if(-1 ==shmctl(shmid, ipc_rmid, null))

return0;

}

程序b:

//

readshm.c

#include

#include

#include

#include

#include

#include

intmain()

//對映共享記憶體,得到虛擬位址

void *p = shmat(shmid, 0, 0

);

if((void*)-1 ==p)

//讀共享記憶體

int x = *(int *)p;

int y = *((int *)p + 1

); printf(

"從共享記憶體中都取了:0x%x 和 0x%x \n

", x, y);

//解除對映

if(-1 ==shmdt(p))

return0;

}

執行結果:

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

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

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

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

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

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