Linux程序通訊之共享記憶體

2021-08-22 06:06:01 字數 2335 閱讀 1531

擁有夢想是一種智力,實現夢想是一種能力

若是乙個多執行緒的程序,由於各個執行緒共享乙個位址空間,可以直接通過變數的形式進行通訊。而程序,由於各個程序獨佔乙個位址空間,我們需要一種通訊機制來完成程序間的資料互動。本章介紹的是共享記憶體,程序間的通訊機制有以下幾種:

無名管道(pipe)

有名管道 (fifo)

訊號(signal)

system  v  ipc

共享記憶體(share memory)

訊息佇列(message queue)

訊號燈集(semaphore set)

套接字(socket)

之間有區分與各自的運用場景,其中套接字通常使用在網路服務,其他只能在本地場景下使用。筆者以後會逐一學習,本章介紹system  v  ipc中的共享記憶體。

system  v ipc引入了三種高階程序間的通訊機制。乙個ipc物件包含訊息佇列、共享內寸和訊號量。

每個ipc物件有唯一的id

ipc物件建立後一直存在,直到被顯式地刪除

每個ipc物件有乙個關聯的key(其中程序的私有物件kty值為0)

ipc物件是全域性物件,可用ipcs,ipcrm等命令檢視或刪除

ipcs -q: 只顯示訊息佇列

ipcs -s: 只顯示訊號量

ipcs -m: 只顯示共享記憶體

ipcs –help: 其他的引數

程序建立ipc物件之前,先ftok生成乙個key值。

#include  

#include

key_t  ftok(const char *path,  int proj_id);

建立/開啟共享記憶體

對映共享記憶體,即把指定的共享記憶體對映到程序的位址空間用於訪問

讀寫共享記憶體

撤銷共享記憶體對映

刪除共享記憶體物件

#include

#include

int shmget(key_t key, int size, int shm***);

#include

#include

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

成功時返回對映後的位址,失敗時返回(void *)-1

shmid   要對映的共享記憶體id

shmaddr   對映後的位址, null表示由系統自動對映

shm***   標誌位  0表示可讀寫;shm_rdonly表示唯讀

通過指標訪問共享記憶體,指標型別取決於共享記憶體中存放的資料型別

例如char *addr;

int  shmid;

……if ((addr = (char *)shmat(shmid, null, 0)) == (char *)-1)

fgets(addr, n, stdin);//從終端讀資料到記憶體

#include

#include

int  shmdt(void *shmaddr);

#include

#include

int  shmctl(int shmid, int cmd, struct shmid_ds *buf);

如果要刪除記憶體

shmctl

(shmid

, ipc_rmid, null) 新增刪除標記,nattach變成0

時真正刪除

#include #include #include #include #include int main(int argc, char *argv)

if ((shmid = shmget(key, 1024, ipc_creat|0666)) < 0)

if ((addr = (char *)shmat(shmid, null, 0)) == (char *)-1)

fgets(addr, n, stdin);

shmdt(addr);

shmctl(shmid, ipc_rmid, null);

return 0;

}

Linux程序通訊之共享記憶體

一 建立共享記憶體,使用shmget函式 int shmget key tkey,int size,int shm 返回值 如果成功,返回共享記憶體段識別符號。如果失敗,則返回 1 errno einval 無效的記憶體段大小 eexist 記憶體段已經存在,無法建立 eidrm 記憶體段已經被刪除...

Linux程序通訊之共享記憶體

建立共享記憶體,得到乙個id 函式shmget 使用虛擬位址訪問核心共享記憶體,可以使用任何記憶體函式函式與運算符號 解除安裝虛擬位址 函式shmdt 刪除共享記憶體 函式shctl 修改,獲取共享記憶體的屬性 include include int shmget key t key,size t ...

linux程序間通訊之共享記憶體

共享記憶體塊提供了在任意數量的程序之間進行高效雙向通訊的機制。每個使用者都可以讀取寫入資料,但是所有程式之間必須達成並遵守一定的協議,以防止諸如在讀取資訊之前覆寫記憶體空間等競爭狀態的出現。不幸的是,linux無法嚴格保證提供對共享記憶體塊的獨佔訪問,甚至是在您通過使用ipc private建立新的...