LINUX程序間通訊(IPC) 共享記憶體

2021-10-08 22:53:26 字數 2096 閱讀 4742

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

ipcs -m (檢視共享記憶體)

ipcrm -m shmid (刪除共享記憶體)

共享記憶體的特點:

(1)共享記憶體就是允許兩個不想關的程序訪問同乙個記憶體

(2)共享記憶體是兩個正在執行的程序之間共享和傳遞資料的最有效的方式

(3)不同程序之間共享的記憶體通常安排為同一段物理記憶體

(4)共享記憶體不提供任何互斥和同步機制,一般用訊號量對臨界資源進行保護。

(5)介面簡單

共享記憶體的缺點

共享記憶體沒有提供同步的機制,這使得我們在使用共享記憶體進行程序間通訊時,往往要借助其他的手段來進行程序間的同步工作。

shmget

shmat

shmdt

shmctl

#include

// 建立或獲取乙個共享記憶體:成功返回共享記憶體id,失敗返回-1

intshmget

(key_t key, size_t size,

int flag)

;void

*shmat

(int shm_id,

const

void

*addr,

int flag)

;// 斷開與共享記憶體的連線:成功返回0,失敗返回-1

intshmdt

(void

*addr)

;int

shmctl

(int shm_id,

int cmd,

struct shmid_ds *buf)

;

a寫資訊到共享記憶體,b讀取

share_a.c

#include

#include

#include

#include

#include

intmain()

shmaddr =

shmat

(shmid,0,

0);//第二個引數和第三個引數指定要對映得物理記憶體位址

//通常設為是 null 0 ,表示要對映得物理記憶體位址是程序空間得首位址

printf

("shmat ok\n");

strcpy

(shmaddr,

"hello world");

//strcpy將字串複製到共享記憶體

sleep(5

);//延時5秒等待b從共享記憶體獲取資訊

shmdt

(shmaddr)

;// 解除對映

//刪除共享記憶體段

shmctl

(shmid,ipc_rmid,0)

;printf

("quit\n");

return0;

}

share_b.c

#include

#include

#include

#include

intmain()

shmaddr =

shmat

(shmid,0,

0);//對映

printf

("shmat ok\n");

printf

("data:%s\n"

,shmaddr)

;//從共享記憶體讀取到a寫入的資訊

demo :執行a程序後,要在a設定的sleep(5)5秒延時內,執行b。否則會讀取錯誤,因為a在經5秒延時後就將共享記憶體刪除了。

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

共享記憶體是基於虛擬記憶體的機制,在程序的位址空間中,共享區域的虛擬頁通過核心中的頁表對映到實際的物理頁中,當多個程序都對映到同一塊物理頁,那麼它們訪問的就是同一片物理記憶體,即共享記憶體。此時基於同一片記憶體,程序間進行資訊傳輸的速度將非常快,每個程序相當於訪問自己位址空間內的記憶體資料。關鍵函式...

程序間通訊IPC 共享記憶體

共享記憶體 共享記憶體 就是開闢一段物理記憶體使多個程序共享 是程序間最高效的傳輸方式 共享記憶體必須結合其他方式來實現程序間的同步 程式設計步驟 1 開闢一段共享記憶體 int shmget key t key,size t size,int shm key t key ftok a stat s...

IPC程序間通訊(共享記憶體)

共享記憶體區是最快的ipc形式。一旦這樣的記憶體對映到共享它的程序的位址空間,這些程序間資料傳遞不再涉及到核心,換句話說是程序不再通過執行進入核心的系統呼叫來傳遞彼此的資料。用管道或者訊息佇列傳遞資料,核心為每個ipc物件維護乙個資料結構 用共享記憶體傳遞資料 struct shmid ds inc...