Linux程序通訊 共享記憶體

2021-06-28 13:40:00 字數 2630 閱讀 3116

對於linux來講,不同程序之間的記憶體是不能讀寫的,乙個程序只能讀寫自己所屬的記憶體。a程序是不能讀寫b程序記憶體的?如果程式確實想通過記憶體交換資料怎麼辦?linux提供共享記憶體機制。共享記憶體是由核心處於多個程序間交換資訊的目的而留出的一塊記憶體區(段)。共享記憶體也需要設定相關許可權的。這段記憶體空間可以由需要訪問的程序將其對映到自己的私有位址空間。如果乙個程序更新了段中資料,其他程序也能立即看到更新。因為系統核心沒有對訪問共享記憶體進行同步,您必須提供自己的同步措施。例如,在資料被寫入之前不允許程序從共享記憶體中讀取資訊、不允許兩個程序同時向同乙個共享記憶體位址寫入資料等。解決這些問題的常用方法是通過使用訊號量進行同步。

如下圖所示:

程序a資料程序b是無法讀取的,程序b資料程序a也是無法讀取的。共享記憶體在記憶體中是乙個單獨的記憶體段,程序a和程序b都不能直接讀。程序自己有乙個記憶體段,和共享記憶體段之間有乙個對應關係,程序每一次在記憶體段寫的資料,作業系統會把程序記憶體段資料自動同步到共享記憶體區域。

使用共享記憶體

1.  類似管道一樣,要使用共享記憶體必須先建立共享記憶體。使用shmget()函式。

2.   對映共享記憶體到具體的程序空間。使用shmat()函式進行對映。撤銷對映有shmdt().

shmget()函式:

所需要的標頭檔案:man 2 shmget 中檢視

#include

#include

#include

函式原型:int shmget(key_t key,int size,int shmflag)

函式傳入值:

key 共享記憶體的鍵值,多個程序可以通過它訪問乙個共享記憶體。通常用特殊常量ipc_private作為鍵值可以保證系統建立乙個全新的共享記憶體塊。

size:共享記憶體區域大小

shm***:同open 函式許可權位,也可以用八進位制表示,如0666.

函式返回值:

成功返回共享記憶體標識,出錯返回-1。

shmat() 函式

所需標頭檔案同上。

函式原型:char * shmat(int shmid,const void *shmaddr,int shm***)

函式傳入值:

shmid 要對映的共享記憶體識別符號

shm*** 預設0 表示可讀可寫,shm_rdonly 表示唯讀。

函式 int shmdt(const void *shmaddr)撤銷對映有shmdt().共享記憶體建立成功後可以通過ipcs -m 命令檢視。當然也可以使用ipcrm -m shmid 刪除對應共享記憶體。

程式說明:

分別執行./main 1  執行./main 2 後shmid 是通過程式獲得的。是通過和鍵值對應關係獲得的。因為兩次執行程式key一樣,再一次執行程式時候會返回errno為存在錯誤碼,

shmid = shmget(key, 0, 0);//由此或得已經存在的共享記憶體shmid

int shmid = shmget(key, shmsize, ipc_creat | ipc_excl | 0666);//注意這裡寫法
shmget(ipc_private,1024,0666);//這種方式都會新建乙個共享記憶體

/*

* main.c

* * created on: 2015-1-29

* author: hsc

*/#include #include #include #include #include#include #include #include #define shmsize 1024

int main(int argc, char *argv)

char *shmaddr;

int key; //共享記憶體的鍵值

// 通過ftok 函式得到乙個鍵值

//這裡.表示當前目錄 ftok就是通過檔案or目錄的索引節點號和id(這裡1)組合成的key

key = ftok(".", 1);

printf("key %d \n", key);

int shmid = shmget(key, shmsize, ipc_creat | ipc_excl | 0666);

if (-1 == shmid) //如果key 不存在

}shmid = shmget(key, 0, 0); //通過key 獲取shmid

if (shmid == -1)

printf("shmid is %d \n", shmid);shmaddr = shmat(shmid, 0, 0); //對映到共享記憶體if (shmaddr == (void *) -1)if (atoi(argv[1]) == 1)if (atoi(argv[1]) == 2)if (shmdt(shmaddr) < 0) //解除對映return 0;}

linux程序通訊 共享記憶體

共享記憶體是ipc機制中的第二個。他允許連個不相關的程序訪問同一塊邏輯記憶體,能夠有效地實現兩個程序間資料傳遞。int shmget key t key,sizr t size,int shm 建立共享記憶體 key為共享記憶體段的命名,size為以位元組為單位的記憶體容量,shm 包含9位元許可權...

Linux程序通訊 共享記憶體

共享記憶體 共享記憶體是一種最為高效的程序間通訊方式,在程序間通訊時核心專門的留出一塊記憶體區。在這段記憶體區可以由訪問程序將其對映到自己的私有位址空間。因此程序就可以直接讀寫這一塊記憶體區,極大的提高了效率。共享記憶體的步驟 1 建立共享記憶體 2 對映貢獻記憶體 原理 相關函式 shmget 建...

linux 程序 共享記憶體通訊

1.概述 該demo主要實現linux下程序之間的共享記憶體通訊,相關介面介紹可以參考 2.場景 半雙工 父程序簡單地通過共享記憶體將資料傳送給子程序 3.測試 程序程式設計demo 共享記憶體 ipc相關的命令 ipcs ipcrm 釋放ipc 檢視程序屬性 ulimit a include in...