Linux處理序間通訊中的共用記憶體是什嗎?共用記憶體的函數執行個體,linux函數
一、共用記憶體是什麼
共用記憶體是兩個進程之間最快的也是最有用的通訊方式。
由於之前我們所介紹的通訊方式都要進過核心和自己的使用者空間之間進行傳遞,而共用記憶體則是進程直接把記憶體映射到自己進程的地址空間內,所以A進程和B進程可直接看到對方對這塊地區所進行的操作。
由於進程可以直接讀寫記憶體,並不需要任何的資料的拷貝,這一點和前面所介紹的進程間的通訊就不一樣,所以它的效率很高,換句話說,進程不再通過執行進入核心的系統調用來傳遞彼此的資料。
二、共用記憶體的結構
和介紹之前的處理序間通訊一樣,我們來看下下面共用記憶體的結構。
struct shmid_ds {struct ipc_perm shm_perm; /* Ownership and permissions */size_t shm_segsz; /* Size of segment (bytes) */time_t shm_atime; /* Last attach time */time_t shm_dtime; /* Last detach time */time_t shm_ctime; /* Last change time */pid_t shm_cpid; /* PID of creator */pid_t shm_lpid; /* PID of last shmat(2)/shmdt(2) */shmatt_t shm_nattch; /* No. of current attaches */ ...};三、共用記憶體的函數(1)shmget
shmget函數用來建立共用記憶體。
函數原型
int shmget(key_t key, size_t size, int shmflg);
參數
key_t key:第一個參數是和訊息佇列中的key是一樣的,表示共用記憶體的名字。 size_t size:第二個參數指的是多大的空間 int shmflg:是許可權,有九個標誌位。可以是IPC_CREAT | 0644 傳回值
成功返回一個非負的整數,即該共用記憶體的標識符,失敗返回-1
(2)shmat
將共用記憶體掛在自己的地址空間上
void *shmat(int shmid, const void *shmaddr, int shmflg);
傳回值
成功返回0,失敗返回-1 參數
shmid:共用記憶體標誌。 shmaddr:指定連結的地址,一般情況下我們取NULL,表示自動選取一個地址。 shmflg:標記,兩個可能的取值為SHM_RND和SHM_RDONLY,一般情況下取0。
(3)shmdt
我們需要注意的是共用記憶體的刪除是沒有人映射的時候才可以刪除,他和訊息佇列不一樣,有人映射的時候是無法刪除。
將不用的共用記憶體從自己的地址空間刪除。
int shmdt(const void *shmaddr);
參數:
由shmdt返回的指標。 傳回值
成功返回0,失敗返回-1
(4)shmctl
shmctl用來控制共用記憶體。
nt shmctl(int shmid, int cmd, struct shmid_ds *buf);
參數
shmid:由shmget返回共用記憶體的標識符 cmd:將要採取的動作 buf:指向一個儲存共用記憶體的模式狀態和存取權限的資料結構 傳回值
成功返回0,失敗返回-1
cmd有以下三個命令可供選擇,這個和訊息佇列的ctl操作很類似
IPC_STAT:把shmid_ds結構中的資料設定為共用記憶體的當前關聯值 IPC_SET:有足夠的許可權下,會把共用記憶體的當前值設定為由shmid_ds資料結構中給出的值 IPC_RMID:刪除共用記憶體
四、如何讀共用記憶體
直接讀自己的進程空間,因為此時記憶體映射到了進程地址空間內。