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

2021-10-05 21:01:31 字數 2997 閱讀 6056

一、共享記憶體的概念

//a

int a =10;

printf

("%d\n"

,a);

//b

int a =10;

printf

("%d\n"

,a);

這兩個程序中的a是沒有關係的。那麼共享記憶體就是記憶體上開闢的一塊區域,能使得ptra和ptrb都指向這個空間,這樣ptra可以在這個空間寫東西,ptrb去檢視的時候會看到a所寫的東西。如下圖所示:

共享記憶體必須有乙個核心物件去指向它,不然它無法儲存所寫的東西。

二、相關函式

1、int shmget():用於建立或者獲取共享記憶體

shmget()成功返回共享記憶體的id,失敗返回-1

key:不同的程序使用相同的key值可以獲取到同乙個共享記憶體

size:建立共享記憶體時,指定要申請的共享記憶體空間大小

flag:ipc_creat ipc_excl

2、void* shmat():將申請的共享記憶體的物理記憶體對映到當前程序的虛擬位址空間上

shmat():成功返回共享記憶體的首位址,失敗返回null

addr:一般給null,由系統自動選擇對映的虛擬位址空間

shmflag:一般給0,可以給shm_rdonly為唯讀模式,其他的為讀寫

3、int shmdt():斷開當前程序的shmaddr指向的共享記憶體對映,並沒有刪除這個共享記憶體

shmdt():成功返回0,失敗返回-1

4、int shmctl():控制共享記憶體

注意:不能使用shmat方法與共享儲存段建立對映關係

三、系統上模擬實現

我們在系統上建立兩個程序a和b

示例:程序a從鍵盤迴圈獲取資料並拷貝到共享記憶體中,程序b從共享記憶體中讀取並列印資料,要求程序a輸入一次,程序b輸出一次。程序a不輸入,程序b也不輸出。

#include

#include

#include

#include

#include

#include

#include

"sem.h"

intmain()

;int semid =

createsem

(1234

, init_val,2)

;assert

(semid !=-1

);while(1

)shmdt

(ptr)

;shmctl

(shmid,ipc_rmid,

null);

}}

#include

#include

#include

#include

#include

#include

#include

"sem.h"

#include

intmain()

;int semid =

createsem

(1234

, init_val,2)

;assert

(semid !=-1

);while(1

)printf

("b process: %s"

,ptr)

;int n =

rand()

%3+1

;sleep

(n);

printf

("b deal over\n");

memset

(ptr,0,

128)

;semv

(semid,1)

;//b--->a

}shmdt

(ptr)

;shmctl

(shmid,ipc_rmid,

null);

deletesem

(semid)

;}

1、這有乙個過程是這樣,乙個是a對b的訊號量,乙個是b對a的訊號量。初始時,a對b中b是阻塞的,a是正常執行的。這塊就需要兩個訊號量乙個是sem1乙個是sem2。系統對sem1和sem2進行p操作,如下圖所示:

2、如果先執行b我們發現b是阻塞的。

3、如果執行a我們發現a中輸入什麼b中就輸出什麼,但是a不能接著輸入,因為得等b處理完成之後才可以繼續輸入。

4、檢視和刪除共享記憶體

(1)命令刪除

ipcs -s:檢視訊號量

ipcs -m:檢視共享記憶體

ipcrm -s 98306

這樣就可以刪除這個訊號量

(2)**刪除

我們可以在剛才的**中呼叫:

deletesem(semid);

這樣就不用手動刪除,只要在a中輸入end結束後,就可以刪除所有東西。

四、共享記憶體的特點

五、程序間通訊的總結

1、類別

2、程序間通訊的目的

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

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

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

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

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

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