3. System V IPC

System V IPC包含三種類型的IPCSystem 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,傳遞pathnameid指定keyIPC_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對象存在,指定一個值爲0oflag參數。

  • 每次IPC操做都對使用該操做的進程執行一次權限測試:超級用戶老是賦予訪問權;若是當前進程的有效用戶ID等於IPC對象的uidcuid,並且相應的訪問位(若是調用者要在IPC對象執行讀操做,那麼讀位必須設置,若是要執行寫操做,那麼寫位必須設置)在IPC對象的mode成員是打開的。

  • 若是當前進程的有效組ID等於IPC對象的gidcgid,並且相應訪問位在IPC對象mode成員中是打開的

  • 若是上面的測試沒有一個爲真,那麼相應的「其餘用戶」訪問位在IPC對象的mode成員中必須是打開的

 

5. 標識符重用

ipc_perm結構的seq變量是一個槽位使用狀況序列號,一個由內核爲系統每一個潛在的IPC對象維護的計數器。每當刪除一個IPC對象,內核就遞增相應的槽位號,若溢出則循環回0System V IPC標識符是系統範圍的,不是特定於進程的。從某個getXXX函數得到一個IPC標識符適用於全部進程。可能致使某些進程嘗試不一樣的小整數標識符,期待找出一個當前容許你們讀訪問的消息隊列。解決辦法是把標識符值可能範圍擴大到全部整數:每次重用一個IPC表項,把返回給調用者的標識符值增長一個IPC表項數。遞增槽位使用狀況序列號的另外一個緣由是避免短期內重用System V IPC標識符,有助於確保過早終止的服務器從新啓動後不會重用標識符。

 

6. ipcs和ipcrm程序

因爲System V IPC的三種類型不是以文件系統中的路徑名標識的,提供兩個特殊程序ipcsipcrmipcs輸出有關System V IPC特性的各類信息,ipcrm刪除一個System V消息隊列、信號量或共享內存區

相關文章
相關標籤/搜索