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

2021-07-28 18:02:14 字數 1453 閱讀 9139

1.      什麼是共享記憶體?

2.      共享記憶體優缺點:

優點:採用共享記憶體的乙份好處是效率高,因為程序可以直接讀寫空間,不需要資料拷貝,而訊息佇列與管道都經過了2次拷貝,寫端寫的時候往佇列拷貝乙份,讀端讀的時候又拷貝了乙份。

缺點:以前的程序間通訊都自帶同步互斥機制,但共享記憶體並沒有,需要自己加鎖。

3.      **實現:

思想:既然程序間通訊為即讀即寫,那麼寫端每秒向記憶體中寫入乙個字元,讀端每秒就會多讀乙個字元。

申請記憶體:

函式:int shmget(key_t key,size_t size,int shm***)

引數:size:記憶體大小,一般為4096的整數倍。4096為一頁的大小。

shm***:ipc_creat,ipc_excl

銷毀記憶體:

函式:intshmctl(int shmid,int cmd,struct shmid_ds * buf)

引數:cmd:這裡設定為0

buf:刪除為ipc_rmid

掛接:函式:void *shmat(int shmid,const void*shmaddr,int shm***)

返回值:與malloc返回值相同,都是返回void*

引數:shmaddr:掛接到指定的記憶體下,一般都為null

shm***:為0

去掛接:

函式:int shmdt(const void *shmaddr)

**:comm.c

#include"comm.h"

static int comm_shm(int size,int flags)

return shmid;

}int creat_shm(int size)

int get_shm()

int destroy_shm(int shmid)

return 0;

}

server.c

//向記憶體中寫

int main()

shmdt(buf);

destroy_shm(shmid);

return 0;

}

client.c

//從記憶體中讀

int main()

shmdt(buf);

return 0;

}

最後執行時,可以用指令碼**實時監控掛接數目。

while :; do ipcs -m|grep -e 'owner|root';sleep 1;echo "###############";done

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

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

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

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

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

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