共享內存:
共享內存時最快的一種IPC(進程間通信)。顧名思義就是兩個不相關的進程訪問同一個邏輯內存。
爲什麼快:管道存在數據的拷貝。通過buffer。而內存共享,直接放入內存中。
缺陷:共享內存並沒有提供同步機制。也就是說A,B可能同時寫入數據,後寫的數據會將前面寫的數據覆蓋掉。所以,我們用信號量對它進行控制。
函數:
頭文件:#include <sys/shm.h>
1、shmget函數:⽤用來創建共享內存
原型:int shmget (key_t key, size_t size, int shmflg)
參數:1)key是一個鍵值。
2)共享內存大小。
3)權限設定,與之前的一致。
返回值:成功返回成功返回一個非負整數,即該共享內存段的表示碼;失敗返回-1。
2、shmat函數:用來啓動對該共享內存的訪問(將這塊內存與進程地址關聯起來),並把共享內存連接到當前進程的地址空間
原型:void *shmat(int shm_id, const void *shm_addr, int shmflg);
參數:1)共享內存段的表示碼。
2)指定鏈接的地址。通常爲NULL,寓意讓系統決定。
3)兩個可能取值:SHM_RND(與shm_addr聯合使用,用來控制共享內存出現的地址)和SHM_RDONLY(使得連接的內存只讀)。
返回值:成功時返回一個地址指針,失敗返回-1;
3、shmdt函數:將進程從共享內存中去除
原型:int shmdt (const void *shmaddr);
參數:由shmat所返回的指針
返回值:成功返回0;失敗返回-1
注意:將共享內存段與當前進程脫離不等於刪除共享內存段
4、shmctl函數:用於控制共享內存
原型:int shmctl (int shmid, int cmd, struct shmid_ds *buf);
參數:1)由shmget返回的共享內存標識碼
2)將要採取的動作(有三個可取值)
IPC_STAT:把shmid_ds結構中的數據設置爲共享內存的當前關聯的值
IPC_SET:在進程有足夠權限的前提下,把共享內存的當前關聯值設置爲shmid_ds結構中給出的值。
IPC_RMID:刪除共享內存段。
3)buf:指向一個保存着共享內存的模式狀態和訪問權限的數據結構
struct shmid_ds
{
uid_t shm_perm.uid;
uid_t shm_perm.gid;
mode_t shm_perm.mode;
}
返回值:成功返回0;失敗返回-1
總結:
共享內存:
優點:無須複製,快捷,信息量大;
缺點:
1)通信是通過將共無法實現享空間緩衝區直接附加到進程的虛擬地址空間中來實現的,因此進程間的讀寫操作的同步問題;
2)利用內存緩衝區直接交換信息,內存的實體存在於計算機中,只能同一個計算機系統中的諸多進程共享,不方便網絡通信