System V IPC包含三種類型的IPC:System V消息隊列、System V信號量、System V共享內存區服務器
1. key_t鍵和ftok函數函數
三種類型的System V IPC使用key_t值做爲名字。頭文件<sys/types.h>定義key_t爲一個至少32位的整數。函數ftok把一個已存在的路徑名和一個整數標識符轉換成一個key_t值,稱爲IPC鍵測試
#include <sys/ipc.h> key_t ftok(const char *pathname, int id);ui
ftok的典型實現調用stat函數,而後組合三個值:stat結構的st_dev信息、stat結構的st_info信息、id的低序8位(不能爲0)。不能保證不一樣的路徑名與同一個id的組合產生不一樣的鍵。spa
2. ipc_perm結構code
內核給每一個IPC對象維護一個信息結構,內容跟內核給文件維護的信息相似對象
struct ipc_perm { uid_t uid; /* owner’s user id */ gid_t gid; /* owner’s group id */ uid_t cuid; /* creator’s user id */ gid_t cgid; /* creator’s group id */ mode_t mode; /* read-write permissions */ ulong_t seq; /* slot usage sequence number */ key_t key; /* IPC key */ };
3. 建立於打開IPC通道隊列
建立或打開一個IPC對象的三個getXXX函數的第一個參數key有兩種選擇:調用ftok,傳遞pathname和id;指定key爲IPC_PRIVATE,保證建立一個新的、惟一的IPC對象。System V IPC定義了本身的IPC_xxx常值進程
#include <sys/ipc.h> <sys/shm.h> int shmget(key_t key, size_t size, int oflag); #include <sys/types.h> <sys/ipc.h> <sys/sem.h> int semget(key_t key, int nsems, int oflag); #include <sys/types.h> <sys/ipc.h> <sys/msg.h> int msgget(key_t key, int oflag);
4. IPC權限ip
oflag參數某些位初始化ipc_perm結構的mode成員
一個進程可經過調用相應IPC機制ctlXXX函數(IPC_SET)修改屬主ID,建立者ID卻從不改變。三個ctlXXX函數容許一個進程修改某個IPC對象的mode成員。
每當有一個進程訪問某個IPC對象,IPC執行兩級檢查:IPC對象被打開時執行一次,每次使用對象時執行一次
每當有一個進程以getXXX函數創建訪問某個存在IPC對象的通道時,IPC執行一次初始檢查,驗證調用者的oflag參數沒有指定不在該對象ipc_perm結構mode成員中的任何訪問位。建立者和調用者的權限位一致。繞過這種檢查的方法:若是已知IPC對象存在,指定一個值爲0的oflag參數。
每次IPC操做都對使用該操做的進程執行一次權限測試:超級用戶老是賦予訪問權;若是當前進程的有效用戶ID等於IPC對象的uid或cuid,並且相應的訪問位(若是調用者要在IPC對象執行讀操做,那麼讀位必須設置,若是要執行寫操做,那麼寫位必須設置)在IPC對象的mode成員是打開的。
若是當前進程的有效組ID等於IPC對象的gid或cgid,並且相應訪問位在IPC對象mode成員中是打開的
若是上面的測試沒有一個爲真,那麼相應的「其餘用戶」訪問位在IPC對象的mode成員中必須是打開的
5. 標識符重用
ipc_perm結構的seq變量是一個槽位使用狀況序列號,一個由內核爲系統每一個潛在的IPC對象維護的計數器。每當刪除一個IPC對象,內核就遞增相應的槽位號,若溢出則循環回0。System V IPC標識符是系統範圍的,不是特定於進程的。從某個getXXX函數得到一個IPC標識符適用於全部進程。可能致使某些進程嘗試不一樣的小整數標識符,期待找出一個當前容許你們讀訪問的消息隊列。解決辦法是把標識符值可能範圍擴大到全部整數:每次重用一個IPC表項,把返回給調用者的標識符值增長一個IPC表項數。遞增槽位使用狀況序列號的另外一個緣由是避免短期內重用System V IPC標識符,有助於確保過早終止的服務器從新啓動後不會重用標識符。
6. ipcs和ipcrm程序
因爲System V IPC的三種類型不是以文件系統中的路徑名標識的,提供兩個特殊程序ipcs和ipcrm。ipcs輸出有關System V IPC特性的各類信息,ipcrm刪除一個System V消息隊列、信號量或共享內存區