Linux 程序間通訊 共享記憶體

2021-09-28 20:57:50 字數 3136 閱讀 3679

基於共享儲存區的通訊方式, 為了傳輸大量資料, 在記憶體中劃出了一塊共享儲存區域, 通訊的程序都可以對這塊記憶體進行操作, 通過對該記憶體的讀或寫交換資訊, 實現通訊, 這種通訊屬於高階通訊, 通訊的程序在通訊前先向系統申請一塊空間, 然後將這塊空間對映到自己的虛擬位址空間中, 使用完成後不再需要的話再將歸還給系統

共享記憶體是所有程序間通訊方式中最快的一種

那麼為什麼共享記憶體是最快的呢?共享記憶體是將同一塊物理記憶體對映到自己的虛擬位址空間中,  實現對相同的一塊物理記憶體進行操作,  通過這種方式實現多個程序間的資料共享功能,  少了兩次使用者態與核心間的資料拷貝過程,  所以最快.注意:

1. 管道生命週期隨核心

2. 共享記憶體是不受保護的, 多個程序同時操作的時候可能會造成混亂, 需要通過同步與互斥進行保護

1. 建立共享記憶體                                     shmget()

2. 將共享記憶體對映到虛擬位址空間        shmat()

3. 對這塊空間進行操作                          memcpy

4. 不使用了就解除對映關係                   shmdt()

5. 刪除共享記憶體                                     shmctl()

1. 建立共享記憶體(在記憶體中建立一塊共享記憶體)

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

注意:shm***是許可權標誌構成, 對許可權不清楚的可以參考linux---許可權, 先了解了解許可權 

2. 建立對映(將共享記憶體與當前程序繫結在一起, 將共享記憶體段連線到程序位址空間)

void *shmat(int shmid, const void *shmaddr, int shm***);

引數 shmid : 識別符號

shmaddr: 置空-對映首位址由作業系統分配

shm*** : 對映成功後的操作許可權

shm_rdonly 唯讀

0 預設-可讀可寫

返回值:

對映首位址 失敗返回:-1

3. 解除對映(將共享記憶體與當前程序脫離)

int shmdt(const void *shmaddr);

shmaddr: 對映首位址

返回值:

成功:0 失敗:-1

注意:4. 控制共享記憶體(可以刪除共享記憶體)

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的部分,所以按照乙個作業系統的整體來說,他應該也有著乙個關於位元組流的訊息傳輸,並且要比之前都要快,還要跟我們...