程序間通訊 共享記憶體

2021-08-30 06:13:16 字數 3493 閱讀 8978

共享記憶體(shared memory)

共享記憶體,簡單的說就是被多個程序共享的記憶體。它在各種程序通訊方法中是最快的,因為它是將資訊直接對映到記憶體中,

省去了其它 ipc方法的中間步驟。

1.shmid_ds

共享記憶體也有乙個給系統記憶體用來儲存相關資訊的機構,就是shmid_ds。

struct shmid_ds

其中:shm_perm 成員儲存了共享記憶體物件的訪問許可權及其它一些資訊。

shm_segsz 成員定義了共享的記憶體大小(以位元組為單位)。

shm_atime 成員儲存了最近一次程序連線共享記憶體的時間。

shm_dtime 成員儲存了最近一次程序斷開與共享記憶體的連線的時間。

shm_ctime 成員儲存了最近一次 shmid_ds 結構內容改變的時

shm_cpid 成員儲存了建立共享記憶體的程序的 pid。

shm_lpid 成員儲存了最近一次連線共享記憶體的程序的 pid。

shm_nattch 成員儲存了與共享記憶體連線的程序數目。

剩下的三個成員被核心保留使用,這裡就不介紹了。

有關的函式

1、sys_shmget()函式

使用shmget()函式來建立新的獲取得已有的共享記憶體。

系統呼叫:shmget()

函式宣告:int shmget(key_t key,int size,int shm***);

返回值:shared memory segment identigier on success

-1 on error: errno =

shmget()函式的第乙個引數key 是共享記憶體的關鍵字;第二個引數 size 是建立的共享記憶體的大小,以位元組為單位。第三個參

數 shm*** 是控制函式行為的標誌量,其取值的含義和作用和 msgget()及semget()函式的對應引數都是相同的.

int open_shm(key_t keyval, int segsize)

return(shmid);

}

2、shmat()函式

當乙個程序使用 shmget()函式得到了共享記憶體的識別符號之後,就可以使用shmat()函式來將共享記憶體對映到程序自己的內

存空間內。

系統呼叫:shmat()

函式宣告: int shmat(int shmid, char *shmaddr, int shm***);

返回值: address at which segment was attached to the process, or

-1 on error: errno =

第乙個引數是共享記憶體的識別符號。

第二個引數 shmaddr 指定了共享記憶體對映的位址。因為這樣必須要預先分配記憶體,十分不便,所以我們在使用時常常將這

個引數置零,這樣系統會自動為對映分配一塊未使用的記憶體。如果指定了位址,可以給第三個引數 shm*** 指定shm_rnd

標誌來強迫將記憶體大小設定為頁面的尺寸。

如果指定了 shm_rdonly引數,共享記憶體將被對映成唯讀。

對映成功後,函式返回指向對映記憶體的指標。

下面的這段**演示了 shmat()函式的使用:

char *attach_segment( int shmid )

得到了對映記憶體的指標之後,我們就可以像讀寫普通記憶體一樣對共享記憶體進行讀寫了。

3、shmctl()函式

和前兩個 ipc 物件一樣,共享記憶體也有乙個直接對其進行操作的函式,就是 shmctl()函式。

系統呼叫: shmctl()

函式宣告:int shmctl(int shmqid, int cmd, struct shmid_ds *buf);

返回值:0 on success

-1 on error: errno =

這個函式和 msgget()函式十分相似,用法也相同。它支援的操作有:

ipc_stat 獲得共享記憶體的資訊。

ipc_set 設定共享記憶體的資訊。

ipc_rmid 刪除共享記憶體。

4、shmdt()函式

當乙個程序不再需要某個共享記憶體的對映時,就應該使用 shmdt()函式斷開對映。

系統呼叫: shmdt()

函式宣告: int shmdt ( char *shmaddr );

返回值: -1 on error: errno = einval (invalid attach address passed)

shmdt()函式唯一的引數是共享記憶體對映的指標。

共享記憶體應用舉例——shmtool,互動式的共享記憶體使用工具

shmtool.c

#include

#include

#include

#define segsize 100

writeshm(int shmid, char *segptr, char *text)

readshm(int shmid, char *segptr)

removeshm(int shmid)

changemode(int shmid, char *mode)

usage()

main(int argc, char *argv)

}else

/* attach (map) the shared memory segment into the current process */

if((segptr= shmat(shmid,0,0))==-1)

switch(tolower(argv[1][0]))

}/home/l/g/tomotoboy/ipc/shm >shmtool r

shared memory segment exists - opening as client

segptr: test

/home/l/g/tomotoboy/ipc/shm >shmtool w "hello:this is a test"

shared memory segment exists - opening as client

done..

/home/l/g/tomotoboy/ipc/shm >shmtool r

shared memory segment exists - opening as client

segptr: hello:this is a test

/home/l/g/tomotoboy/ipc/shm >shmtool d

shared memory segment exists - opening as client

shared memory segment marked for deletion

/home/l/g/tomotoboy/ipc/shm >shmtool r

creating new shared memory segment

segptr:

程序間通訊 共享記憶體

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

程序間通訊 共享記憶體

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

程序間通訊 共享記憶體

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