標籤:style blog http ar color 使用 sp strong 檔案
共用記憶體地區是被多個進程共用的一部分實體記憶體。如果多個進程都把該記憶體區域對應到自己的虛擬位址空間,則這些進程就都可以直接存取該共用記憶體地區,從而可以通過該地區進行通訊。共用記憶體是進程間共用資料的一種最快的方法,一個進程向共用記憶體地區寫入了資料,共用這個記憶體地區的所有進程就可以立刻看到其中的內容。這塊共用虛擬記憶體的頁面,出現在每一個共用該頁面的進程的頁表中。但是它不需要在所有進程的虛擬記憶體中都有相同的虛擬位址
以下是使用共用記憶體機制進行處理序間通訊的基本操作:
需要包含的標頭檔:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
1.建立共用記憶體:
int shmget(key_t key,int size,int shmflg);
參數說明:
key:用來表示建立或者已經存在的共用記憶體去的關鍵字。
size:建立共用記憶體的大小。
shmflg:可以指定的特殊標誌。IPC_CREATE,IPC_EXCL以及低九位的許可權。
eg:
int shmid;
shmid=shmget(IPC_PRIVATE,4096,IPC_CREATE|IPC_EXCL|0660);
if(shmid==-1)
perror("shmget()");
2.串連共用記憶體
char *shmat(int shmid,char *shmaddr,int shmflg);
參數說明
shmid:共用記憶體的關鍵字
shmaddr:指定共用記憶體出現在進程記憶體位址的什麼位置,通常我們讓核心自己決定一個合適的地址位置,用的時候設為0。
shmflg:制定特殊的標誌位。SHM_RDONLY:為唯讀模式,其他為讀寫入模式,一般為0。
eg:
int shmid;
char *shmp=shmat(shmid,0,0);
if(shmp==(char *)(-1))
perror("shmat()\n");
3.使用共用記憶體
在使用共用記憶體是需要注意的是,為防止記憶體存取違規,我們一般與訊號量結合使用。
4.分離共用記憶體:
當程式不再需要共用內後,我們需要將共用記憶體分離以便對其進行釋放,分離共用記憶體的函數原形如下:
int shmdt(char *shmaddr);
5. 釋放共用記憶體
int shmctl(int shmid,int cmd,struct shmid_ds *buf);
Linux 處理序間通訊 - 共用記憶體shmget方式