Linux程序間通訊 共享記憶體

2021-08-09 14:15:24 字數 2122 閱讀 4582

一句話總結:建立共享記憶體,並將之掛接到我們自定義的變數。優點是訪問速度快,缺點是共享記憶體本身不具備同步機制,需加同步原語保證操作的原子性。

四大金剛:

1、建立共享記憶體:int

shmget(key_t key, 

size_t

size, 

intshm***); 

2、啟動訪問(attach,掛接到程序),可選擇將共享記憶體位址鏈結到指定位址位置:void

*shmat(

intshm_id,

const void*shm_addr, 

intshm***); 

3、解除訪問(deattach,解除掛接):int

shmdt(

const void

*shmaddr); 

4、操作共享記憶體:int

shmctl(

intshm_id, 

intcommand,const void

shmid_ds *buf); 

第乙個引數,shm_id是shmget函式返回的共享記憶體識別符號。

第二個引數,command是要採取的操作,它可以取下面的三個值 :

ipc_stat:把shmid_ds結構中的資料設定為共享記憶體的當前關聯值,即用共享記憶體的當前關聯值覆蓋shmid_ds的值。

ipc_set:如果程序有足夠的許可權,就把共享記憶體的當前關聯值設定為shmid_ds結構中給出的值

ipc_rmid:刪除共享記憶體段

第三個引數,buf是乙個結構指標,它指向共享記憶體模式和訪問許可權的結構。

shmid_ds結構至少包括以下成員:

struct shmid_ds  

;  

廢話不多說,直接上**:

shm_reader.cpp

#include #include #include #include #include #define test_size 2048  

typedef struct sharememory_st

shm_st;

int main()

if (5 == i)

} shmdt(shm); //失敗返回-1,假設成功

shmctl(shmid, ipc_rmid, 0); //失敗返回-1,假設成功。僅在reader這裡刪除共享記憶體,保證讀完最後乙個訊息

return 0;

}

shm_writer.cpp

#include #include #include #include #include #define test_size 2048  

typedef struct sharememory_st

shm_st;

int main()

if (5 == i)

} shmdt(shm); //失敗返回-1,假設成功

return 0;

}

執行結果:執行shm_reader,檢視共享記憶體,nattch是1;執行shm_writer後變成2;shm_writer按下enter,傳送訊息,reader可以讀到訊息,5次後退出。

開啟讀:

key        shmid      owner      perms      bytes      nattch     status 

0x000004d2 5210130    zjy        666        2052       1

開啟寫:

key        shmid      owner      perms      bytes      nattch     status 

0x000004d2 5210130    zjy        666        2052       2

key:1234=0x000004d2,許可權perms是666,bytes是結構體大小2048+4,nattch是數量。

Linux程序間通訊 共享記憶體

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

Linux程序間共享記憶體通訊

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

Linux程序間通訊 共享記憶體

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