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

2021-08-21 14:11:33 字數 2586 閱讀 6637

共享記憶體,主要是實現程序間大量資料的傳輸。所謂共享記憶體,即在記憶體中開闢一段特殊的記憶體空間,多個程序可互斥訪問,該記憶體空間具有自身特有的資料結構。

共享記憶體的資料結構如下 - struct shmid_ds:

/*  come from /usr/include/linux/shm.h  */

/* obsolete, used only for backwards compatibility and libc5 compiles */

struct shmid_ds ;

多個程序在使用此共享記憶體空間時候,必須在程序位址空間與共享記憶體位址空間之間建立連線,即將共享記憶體空間掛載到程序中;

共享記憶體是由乙個程序開闢,其它任何程序都可以掛載;

共享記憶體並不會隨著程序的退出而消失,因此最後不使用此記憶體空間時,必須要手動刪除。

macrono.descriptionhead fileipc_creat01000若key記憶體段不存在,則建立;否則返回記憶體首位址/usr/include/linux/ipc.h

ipc_excl02000若key記憶體段存在,則返回錯誤

ipc_nowait04000不等待直接返回

shm_r0400可讀/usr/include/linux/shm.h

shm_w0200可寫/usr/include/linux/shm.h

返回值:

成功:共享記憶體空間的標誌 shm_id

失敗:-1

macrono.descriptionreturnipc_rmid0刪除0

ipc_set1設定 ipc_perm 引數0

ipc_stat2獲取 ipc_perm 引數

ipc_info3ipcs命令

shm_lock11鎖定共享記憶體段0

shm_unlock12解鎖共享記憶體段0

返回值:

成功:失敗:-1

macrono.descriptonremind-0預設有讀寫許可權常用

shm_rdonly010000唯讀

shm_rdn020000round attach address to shmlba boundary

shm_remap040000take-over region on attach

兩個程序通過共享記憶體傳輸資料,因共享記憶體不可同時讀寫,因此採用二元訊號量進行程序互斥,具體操作如下:

Linux程序間通訊 共享記憶體

共享記憶體是執行在同一臺機器上的程序間通訊最快的方式,因為資料不需要在不同的程序間複製。通常由乙個程序建立一塊共享記憶體區,其餘程序對這塊記憶體區進行讀寫。共享記憶體往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。首先要用的函式是shmget,它獲得乙個共享儲存識別符號。i nclu...

Linux程序間共享記憶體通訊

使用共享記憶體基本分四個步驟 獲得共享記憶體 shmget 對映共享記憶體shmat 解除對映shmdt 刪除共享記憶體shmctl 於是自己在網上找來了乙個例子看了下,並且用虛擬機器單獨跑了下共享記憶體的經典例程看了下,才知道了自己的問題出現 了 發現有時候只要自己親自將程式一步一步的去測,才知道...

Linux程序間通訊 共享記憶體

之前提到了程序間通訊的管道,訊息佇列,訊號量,然後其中訊號量是pv操作,操控的是乙個共享資源。在我們提到的ipc模組中,訊息佇列針對的是資料單元的資訊傳送,管道不屬於system v ipc的部分,所以按照乙個作業系統的整體來說,他應該也有著乙個關於位元組流的訊息傳輸,並且要比之前都要快,還要跟我們...