程序間通訊 共享記憶體

2021-08-18 08:49:00 字數 2253 閱讀 9035

共享記憶體是最快的ipc形式。因為程序不再通過執行進入核心的系統呼叫來傳遞彼此的資料,省略了兩次記憶體拷貝。

shmget函式

功能:用來建立共享記憶體

函式原型:int   shmget(key_t   key,size_t   size,int   shm***);

引數:key:共享記憶體段的名字;

size:共享記憶體大小,以頁為基本單位,一般一頁的大小為4k。

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

shmat函式:

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

引數:shmid:共享記憶體標識;

shm***:它的兩個可能取值分別為shm_rnd和shm_rdonly。

返回值:成功返回乙個指標,指向共享記憶體第乙個節;失敗返回-1。

shmdt函式:

功能:將共享記憶體段與當前程序脫離。

函式原型:int   shmdt(const   void   *shmaddr);

引數:shmaddr:由shmat所返回的指標;

返回值:成功返回0;失敗返回-1。

注意:將共享記憶體段與當前程序脫離不等於刪除共享記憶體段。

shmctl函式:

功能:用於控制共享記憶體。

函式原型:int   shmctl(int   shmid,int   cmd,struct   shmid_ds   *buf);

引數:shmid:由shmget返回的共享記憶體標識碼;

cmd:將要採取的動作;

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

返回值:成功返回0;失敗返回-1。

makefile:

.phony:all

all:server client

client:client.c comm.c

gcc -o $@ $^

server:server.c comm.c

gcc -o $@ $^

.phony:clean

clean:

rm -f client server

comm.h:

#ifndef _comm_h_

#define _comm_h_

#include#include#include#include#define pathname "."

#define proj_id 0x6666

int createshm(int size);

int destroyshm(int shmid);

int getshm(int size);

#endif

comm.c:

#include "comm.h"

static int commshm(int size,int flags)

int shmid = 0;

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

}int destroyshm(int shmid)

return 0;

}int createshm(int size)

int getshm(int size)

server.c:

#include "comm.h"

int main()

shmdt(addr);

sleep(2);

destroyshm(shmid);

return 0;

}

client.c:

#include "comm.h"

int main()

shmdt(addr);

sleep(2);

return 0;

}

ipcs   -m : 檢視共享記憶體;

ipcrm   -m :刪除共享記憶體。

程序間通訊 共享記憶體

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

程序間通訊 共享記憶體

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

程序間通訊 共享記憶體

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