Linux程序通訊之共享記憶體

2021-07-17 04:09:05 字數 1522 閱讀 4733

建立共享記憶體,得到乙個id(函式shmget)

使用虛擬位址訪問核心共享記憶體,可以使用任何記憶體函式函式與運算符號

解除安裝虛擬位址 (函式shmdt)

刪除共享記憶體 ,函式shctl(修改,獲取共享記憶體的屬性)

#include 

#include

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

接著呼叫shmat來得到共享記憶體,進行讀寫。shmdt來進行解除安裝

#include 

#include

void *shmat(int shmid, const

void *shmaddr, int shm***);

int shmdt(const

void *shmaddr)

最後是shmctl

#include 

#include

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

ipc_stat:得到共享記憶體的狀態,把共享記憶體的shmid_ds結構複製到buf中

ipc_set:改變共享記憶體的狀態,把buf所指的shmid_ds結構中的uid、gid、mode複製到共享記憶體的shmid_ds結構內

ipc_rmid:刪除這片共享記憶體

一般我們用來刪除id的話,傳入ipc_rmid即可,接收方不需要刪除共享記憶體

shma.c

#include 

#include

#include

#include

#include

#include

key_t key;

int shmid;

int* p;

int i=0;

void handle(int s)

}int main()

//4. deattach shared memory

//5. control(delete shared memory)

return

0;}

shmb.c

#include 

#include

#include

#include

#include

#include

key_t key;

int shmid;

int *p;

void handle(int s)

}int main()

//4. deattach shared memory

shmdt(p);

//5. control(delete shared memory)

//return

0;}

Linux程序通訊之共享記憶體

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

Linux程序通訊之共享記憶體

擁有夢想是一種智力,實現夢想是一種能力 若是乙個多執行緒的程序,由於各個執行緒共享乙個位址空間,可以直接通過變數的形式進行通訊。而程序,由於各個程序獨佔乙個位址空間,我們需要一種通訊機制來完成程序間的資料互動。本章介紹的是共享記憶體,程序間的通訊機制有以下幾種 無名管道 pipe 有名管道 fifo...

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

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