System V版本IPC程序間通訊主題之共享記憶體

2021-08-02 09:31:19 字數 2220 閱讀 9600

一.什麼是共享記憶體

共享記憶體:使得多個程序可以訪問同一塊記憶體空間,是最快的可用ipc形式。是針對其他通訊機制執行效率較低而設計的。一旦這樣的記憶體對映到共享它的程序的位址空間,這些程序間資料傳遞不再涉及到核心,換句話說就是,程序不再通過執行進入核心的系統呼叫來傳遞彼此的資料

它的工作原理可以用下圖來解釋:

兩個不同的程序通過頁表對映將其中的內容儲存到一塊相同的物理記憶體中,這一塊記憶體就是共享記憶體。

共享記憶體的資料結構/usr/include/linux/shm.h

struct shmid_ds ;
二.關於共享記憶體的函式為了模擬共享記憶體,我們設計了乙個測試用例來測試。下面先介紹一下幾個必要的函式。

1 shmget函式

返回值:成功返回乙個非負整數,即該共享記憶體的標識碼;失敗返回-1。

2 shmctl函式,控制共享記憶體

shmid:有shmget返回的乙個共享記憶體識別符號。

buf:指向乙個儲存著共享記憶體的模式狀態和訪問許可權的資料結構(通常設為null)

cmd:有三個選項

三.用共享記憶體實現客戶端client和服務端server的通訊

common.h

#pragma once

#include

#include

#include

#include

#include

#define pathname "."

#define proj_id 0x666

int createshm(int size);

int getshm(int size);

int destroyshm(int shmid);

common.c

#include "common.h"

static int commonshm(int

size,int flags)

int shmid=shmget(key,size,flags);

if(shmid<0)

return shmid;

}int createshm(int

size)

int getshm(int

size)

int destroyshm(int shmid)

return

0;}

server.c

#include "common.h"

int main()

shmdt(addr);//將共享記憶體與服務端斷開連線

destroyshm(shmid);

return

0;}

client.c

#include "common.h"

int main()

shmdt(addr);

return

0;}

執行的結果如下圖

服務端一執行就一直在等待客戶端向共享記憶體裡寫資料,客戶端一旦往共享記憶體中寫入資料,服務端就打出客戶端往共享記憶體中寫入的資料。

刪除共享記憶體:ipcrm -m + shmid

下面總結一下共享記憶體的特點:

程序間通訊IPC

這兩天學習了 unix 的程序間通訊 ipc,這裡面有幾個很重要的基本概念,特別是訊息佇列和我的畢設很有關係,因此多說幾句。以前學習的程序間通訊方式,一般都是經由 fork 或exec 開啟檔案,或經過檔案系統。而 ipc是程序間通訊方式的統稱。下面一一道來。一 管道 管道是最老的 ipc形式。管道...

程序間通訊 IPC

part2 index1.html part2 index2.html linux至少支援如下ipc機制 同時支援posix和system v方式 streams ipc機制,linux本身不支援,有乙個單獨的安裝包 可以跨pc的程序通訊 互斥鎖或條件變數 動態初始化 不能使靜態分配 在共享記憶體中...

程序間通訊IPC

乙個大型的應用系統,往往需要眾多程序協作,程序間通訊的重要性顯而易見。首先,程序間通訊至少可以通過傳送開啟檔案來實現,不同的程序通過乙個或多個檔案來傳遞資訊,事實上,在很多應用系統裡,都使用了這種方法。但一般說來,程序間通訊 ipc interprocess communication 不包括這種似...