曾巨集安,
華清遠見嵌入式學院
講師。1.共享記憶體概述
共享記憶體允許兩個或更多程序共享一給定的儲存區。因為資料不需要在各個程序之間複製,所以這是最快的一種程序間通訊方式。使用共享記憶體時的關鍵點在於如何在多個程序之間對一給定的儲存區進行同步訪問。
例如若乙個程序正在將資料放入共享記憶體區,則在它做完這一操作之前,其他程序不應該去取這些資料。通常,訊號量被用來實現對共享記憶體訪問的同步。
2.函式說明
共享記憶體的實現分為4個步驟。
第一步是建立共享記憶體,這裡用到的函式是shmget,也就是從記憶體中獲得一段共享記憶體區域。
第二步是對映共享記憶體,也就是把這段建立的共享記憶體對映到具體的程序空間去。這裡使用的函式是shmat。
第三步是撤銷對映的操作,其函式為shmdt。
第四步是刪除建立的共享記憶體,用到的函式是shmctl。
3.函式格式
以上函式用到的標頭檔案如下所示。
#include
#include
#include
shmget函式的語法
函式原型
intshmget( key_t key, /* ipc_private */
int size, /* 共享記憶體區大小 */
int shm***) /* 同open函式的許可權位,也可以用8進製表示法 */
函式返回值
成功:共享記憶體段識別符號
出錯:-1
shmat函式的語法
函式原型
char *shmat( int shmid, /* 要對映的共享記憶體區識別符號 */
const void *shmaddr, /* 將共享記憶體對映到指定位置(若為0則表示把該段共享記憶體對映到呼叫程序的位址空間)*/
int shm***) /* shm_rdonly :共享記憶體唯讀
預設0 :共享記憶體可讀寫*/
函式返回值
shmdt函式的語法
函式原型
int shmdt(const void *shmaddr) /* 被對映的共享記憶體段位址 */
函式返回值
成功:0
出錯:-1
shmctl函式的語法
函式原型
intshmctl(int shmid, /* 要操作的共享記憶體區識別符號 */
int cmd, /*ipc _rmid : 刪除共享記憶體
ipc_stat : 獲取共享記憶體屬性
ipc_set : 設定共享記憶體屬性 */
struct shmid_ds *buf) /* 指向儲存共享記憶體屬性的結構體的指標*/
函式返回值
成功:0
出錯:-1
4.使用例項
首先使用shmget函式,首先建立乙個共享記憶體區,之後將其對映到本程序中,最後再解除這種對映關係並刪除建立的共享記憶體。
這裡要介紹的乙個命令是ipcs,這是用於報告程序間通訊機制狀態的命令,它可以檢視共享記憶體、訊息佇列等各種程序間通訊機制的情況,這裡使用了system函式用於呼叫命令ipcs,參考**如下所示:
/*建立共享記憶體*/
int shmid;
void *shmadd;
if ((shmid = shmget(ipc_private,bufsz,0666)) < 0 )
syetem(「ipcs –m」);
/*對映共享記憶體*/
if ((shmadd = shmat(shmid,0,0)) == null )
syetem(「ipcs –m」);
/*刪除共享記憶體*/
if (shmdt(shmadd) < 0 )
syetem(「ipcs –m」);
if (shmctl(shmid, ipc_rmid, null) < 0 )
syetem(「ipcs –m」);
程序間通訊之共享記憶體(一)
1 共享記憶體概述 共享記憶體允許兩個或更多程序共享一給定的儲存區。因為資料不需要在各個程序之間複製,所以這是最快的一種程序間通訊方式。使用共享記憶體時的關鍵點在於如何在多個程序之間對一給定的儲存區進行同步訪問。例如若乙個程序正在將資料放入共享記憶體區,則在它做完這一操作之前,其他程序不應該去取這些...
程序間通訊之共享記憶體
此程式實現兩個普通程序間通過共享記憶體來進行通訊,共享記憶體能夠進行大資料量的通訊,這一點事訊息佇列無法比擬的。在這裡同時使用了訊號量來保證兩個程序間的讀寫同步。傳送端源 include include include include include include include include ...
程序間通訊之共享記憶體
1.概念 共享記憶體就是多個程序的位址空間對映到同乙個物理記憶體,多個程序都能看到這塊物理記憶體,共享記憶體可以提供給伺服器程序和客戶程序之間進行通訊,不需要進行資料的複製,所以速度最快。2.共享記憶體操作需要的函式 1 我們需要利用ftok函式生成key識別符號。key t ftok const ...