基於共享儲存區的通訊方式, 為了傳輸大量資料, 在記憶體中劃出了一塊共享儲存區域, 通訊的程序都可以對這塊記憶體進行操作, 通過對該記憶體的讀或寫交換資訊, 實現通訊, 這種通訊屬於高階通訊, 通訊的程序在通訊前先向系統申請一塊空間, 然後將這塊空間對映到自己的虛擬位址空間中, 使用完成後不再需要的話再將歸還給系統共享記憶體是所有程序間通訊方式中最快的一種
那麼為什麼共享記憶體是最快的呢?共享記憶體是將同一塊物理記憶體對映到自己的虛擬位址空間中, 實現對相同的一塊物理記憶體進行操作, 通過這種方式實現多個程序間的資料共享功能, 少了兩次使用者態與核心間的資料拷貝過程, 所以最快.注意:1. 管道生命週期隨核心
2. 共享記憶體是不受保護的, 多個程序同時操作的時候可能會造成混亂, 需要通過同步與互斥進行保護
1. 建立共享記憶體 shmget()
2. 將共享記憶體對映到虛擬位址空間 shmat()
3. 對這塊空間進行操作 memcpy
4. 不使用了就解除對映關係 shmdt()
5. 刪除共享記憶體 shmctl()
1. 建立共享記憶體(在記憶體中建立一塊共享記憶體)
注意:shm***是許可權標誌構成, 對許可權不清楚的可以參考linux---許可權, 先了解了解許可權int shmget(key_t key, size_t size, int shm***);
引數: key : 共享記憶體識別符號
可以使用define巨集定義, 也可以使用ftok函式進行生成, 但是一般推薦使用define更好一點
size : 共享記憶體大小
shm***: 選項標誌
ipc_creat 共享記憶體不存在則建立, 存在則開啟
ipc_excl 與ipc_creat同用, 共享記憶體存在則報錯
shm_mode 許可權
返回值:
識別符號(**中的操作控制代碼) 失敗:-1
2. 建立對映(將共享記憶體與當前程序繫結在一起, 將共享記憶體段連線到程序位址空間)
3. 解除對映(將共享記憶體與當前程序脫離)void *shmat(int shmid, const void *shmaddr, int shm***);
引數 shmid : 識別符號
shmaddr: 置空-對映首位址由作業系統分配
shm*** : 對映成功後的操作許可權
shm_rdonly 唯讀
0 預設-可讀可寫
返回值:
對映首位址 失敗返回:-1
注意:4. 控制共享記憶體(可以刪除共享記憶體)int shmdt(const void *shmaddr);
shmaddr: 對映首位址
返回值:
成功:0 失敗:-1
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmid: 操作控制代碼
cmd : 操作型別
ipc_rmid 刪除共享記憶體
ipc_stat 把shmid_ds結構中的資料設定為共享記憶體的當前關聯值
ipc_set 在程序中有許可權的前提下, 把共享記憶體的當前關聯設定為shmid_ds中給出的值
buf : 設定/獲取共享記憶體資訊
共享記憶體不會被直接刪除, 而是判斷當前對映連線數是否為0
為0: 直接刪除
不為0: 拒絕後續其它程序的對映連線, 當對映連線數為0時自動刪除
shm_write.c
#include #include #include #include #define ipc_key 0x12345678
int main()
//2. 建立對映
char* shm_start = shmat(shmid, null, 0);
if(shm_start == (void*)-1)
//3.操作
int i = 0;
while(1)
//4.解除對映
shmdt(shm_start);
//5.刪除共享記憶體
shmctl(shmid, ipc_rmid, null);
return 0;
}
只在第三步操作時候做出了修改shm_read.c
執行://3.操作
int i = 0;
while(1)
Linux程序間通訊 共享記憶體
共享記憶體是執行在同一臺機器上的程序間通訊最快的方式,因為資料不需要在不同的程序間複製。通常由乙個程序建立一塊共享記憶體區,其餘程序對這塊記憶體區進行讀寫。共享記憶體往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。首先要用的函式是shmget,它獲得乙個共享儲存識別符號。i nclu...
Linux程序間共享記憶體通訊
使用共享記憶體基本分四個步驟 獲得共享記憶體 shmget 對映共享記憶體shmat 解除對映shmdt 刪除共享記憶體shmctl 於是自己在網上找來了乙個例子看了下,並且用虛擬機器單獨跑了下共享記憶體的經典例程看了下,才知道了自己的問題出現 了 發現有時候只要自己親自將程式一步一步的去測,才知道...
Linux程序間通訊 共享記憶體
之前提到了程序間通訊的管道,訊息佇列,訊號量,然後其中訊號量是pv操作,操控的是乙個共享資源。在我們提到的ipc模組中,訊息佇列針對的是資料單元的資訊傳送,管道不屬於system v ipc的部分,所以按照乙個作業系統的整體來說,他應該也有著乙個關於位元組流的訊息傳輸,並且要比之前都要快,還要跟我們...