程序間通訊 共享記憶體

2021-08-20 07:15:56 字數 2569 閱讀 7329

共享記憶體就是借助同一塊物理記憶體對映不同的虛擬位址空間,不同的虛擬位址空間代表著不同的程序,所以多個程序都能看到這一塊記憶體,那麼就可以同時對這塊記憶體讀寫操作。

我們畫張圖感受一下:

共享記憶體是一塊記憶體,它的資料結構中都有以下資料

shmget函式:用來建立共享記憶體

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

//key共享記憶體段的名字

//size:共享記憶體大小(返回的大小等於size向上取整到4k的整數倍例如size=4097,那麼返回的記憶體大小為8k即為兩頁)

//shm***:許可權

//返回值:成功返回乙個非負整數(記憶體標識碼),失敗返回-1;

void* shmat(int shmid,const

void* shmaddr,int shm***);

//shmid:共享記憶體標識碼

//shmaddr:連線的位址

//shm***:有兩個取值可能是shm_rnd和shm_rdonly

//返回值:成功返回乙個指標,指向共享記憶體第乙個位元組,失敗返回-1

說明:

1、shmaddr為null,核心自動選擇乙個位址

2、不為null,如果shm***設定了shm_rnd標記,那麼連線的位址會自動向下調整為shmlba的整數倍(shmaddr-(shmaddr%shmlba);如果沒有設定shm_rnd標記那麼shmaddr就是連線的位址。

3、shm***=shm_rdonly,表示連線操作用來唯讀共享記憶體

shmdt函式:將共享記憶體段與當前程序脫離

int shmdt(const

void* shmaddr);

//shmaddr:是shmat返回的shmaddr

//返回值:失敗返回-1,成功返回0

注意:將共享記憶體與當前程序脫離並不意味著共享記憶體的釋放。

shmctl函式:共享記憶體的控制函式

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

//shmid:shmget函式獲得的共享記憶體識別符號

//cmd:將要採取的動作

//buf:指向乙個儲存著共享記憶體的模式狀態和訪問許可權的資料結構

//成功返回0,失敗返回-1

cmd解釋:

命令說明

ipc_stat

把shmid結構中的資料設定為共享記憶體的當前關聯值

ipc_set

在程序有足夠許可權的前提下,把共享記憶體的當前關聯值設定為shmid_ds資料結構中給出的值

ipc_rmid

刪除共享記憶體段

示例**:

client.c檔案:

#include"shmem.h"

#include

int main()

shmdt(addr);

sleep(2);

return

0;}

server.c檔案:

#include"shmem.h"

int main()

shmdt(addr);

sleep(2);

destroyshm(shmid);

return

0;}

shmem.c檔案:

#include"shmem.h"

static int commshm(int

size,int flags)

int shmid=0;

if(shmid=shmget(key,size,flags)<0)

return shmid;

}int createshm(int

size)

int openshm(int

size)

int destroyshm(int shmid)

}

shmem.h檔案:

#include

#include

#include

#include

#define pathname "."

#define proj_id 0x6666

int createshm(int size);

int openshm(int size);

int destroyshm(int shmid);

程序間通訊 共享記憶體

下面是自己寫的乙個簡單的共享記憶體的程序間通訊的例子。共享記憶體是用於程序間大量資料共享的一種方法。include include include include include include int main if buf1 shmat shmid,0,0 void 1 strcpy buf1,...

程序間通訊 共享記憶體

共享記憶體是被多個程序共享的一部分物理記憶體。共享記憶體是程序間共享資料的一種最快的方式,乙個程序向共享記憶體區域寫入資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。共享記憶體實現分兩個步驟 建立共享記憶體,使用shmget函式 對映共享記憶體,使用shmat函式 共享記憶體是一種最為高...

程序間通訊 共享記憶體

共享記憶體允許兩個或更多程序共享一塊給定的儲存區,因為資料不需要在不同程序之間訪問,這是最快的一種ipc 傳輸資訊量很大,通過記憶體空間對映程序空間實現,若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應取這些資料,通常訊號量用來實現對共享儲存訪問的同步。核心為每個共享儲存段...