一句話總結:建立共享記憶體,並將之掛接到我們自定義的變數。優點是訪問速度快,缺點是共享記憶體本身不具備同步機制,需加同步原語保證操作的原子性。
四大金剛:
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的部分,所以按照乙個作業系統的整體來說,他應該也有著乙個關於位元組流的訊息傳輸,並且要比之前都要快,還要跟我們...