共享記憶體(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 傳輸資訊量很大,通過記憶體空間對映程序空間實現,若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應取這些資料,通常訊號量用來實現對共享儲存訪問的同步。核心為每個共享儲存段...