天天看點

一起talk C栗子吧(第九十四回:C語言執行個體--SystemV IPC結構概述)

各位看官們,大家好,上一回中咱們說的是程序間通信之臨界資源的例子,這一回咱們說的例子是:SystemV IPC結構概述。閑話休提,言歸正轉。讓我們一起talk C栗子吧!

看官們, 我們通常所說的IPC是程序間通信的簡稱,這隻是一個抽象的稱呼,今天說的SystemV IPC是具體的一種IPC,因為它廣泛應用于Unix SystemV版本中,是以取名叫作SystemV IPC。當然了,我們使用的Linux系統中也支援該類型的IPC。接下來我們詳細介紹SystemV IPC。

1.SystemV IPC的定義

SystemV IPC是在系統核心中實作的,它是核心中的一種結構,該結構是一種抽象的概念,我們可以把它實作為具體的對象。比如,電腦是一個抽象的概念,而台式電腦,筆記本電腦和平闆電腦就是具體的一種電腦産品。與SystemV IPC結構有關的SystemV IPC對象有:共享記憶體,消息隊列和信号量,我們會在後面章回中介紹這些具體的SystemV IPC對象。

2.SystemV IPC的使用

在核心中需要使用辨別符來使用IPC結構,辨別符類似于我們使用檔案時的檔案描述符,它是一個非負整數值,不過它的值通常都是比較大的數值。辨別符是核心裡的東西。我們通常沒有辦法直接使用,是以需要使用鍵(key)來與辨別符建立聯系,這樣我們就可以通過操作鍵來操作SystemV IPC在核心中的結構,進而操作SystemV IPC對象,比如共享記憶體。

在程式中我們可以任意指定一個整數值來在當鍵值,不過該方法不太好。常用的是使用IPC_PRIVATE鍵來建立IPC對象。或者使用ftok函數來生成唯一的鍵。

3.SystemV IPC的結構

SystemV IPC結構有一個ipc_perm結構,該結構是一個結構體,它包含有IPC的權限和所有者等資訊,具體的内容如下(來自:/linux-4.0.3/include/linux/ipc.h檔案中)

/* used by in-kernel data structures */
struct kern_ipc_perm
{
    spinlock_t  lock;
    bool        deleted;
    int     id;
    key_t       key;
    kuid_t      uid;  //must
    kgid_t      gid;  //must
    kuid_t      cuid; //must
    kgid_t      cgid; //must
    umode_t     mode; //must
    unsigned long   seq;
    void        *security;
};
           

該結構中不同的SystemV IPC對象會有不同的定義,但是我添加了//must的成員是每個SystemV IPC對象必須包含的。

4.SystemV IPC的使用

SystemV IPC的使用随着SystemV IPC對象的不同而不同,但是整體的使用流程還是一緻的:

  • 擷取一個SystemV IPC對象;
  • 操作SystemV IPC對象;
  • 釋放SystemV IPC對象。

我們在後面章回中介紹到具體的SystemV IPC對象時會介紹詳細的操作方法。

此外,Linux系統中的SystemV IPC對象是在核心中的,不像檔案一樣可以被檢視到。強大的Linux提供了相關的指令來操作SystemV IPC。

ipcs指令可以檢視系統中所有的SystemV IPC對象,它們是:共享記憶體,消息隊列和信号量。

下面是在系統中運作ipcs的結果:

ipcs              //運作ipcs指令

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
      talk8                             dest         
     talk8                               dest         
...               //其它的省略
------ Semaphore Arrays --------
key        semid      owner      perms      nsems     
           talk8                         
   //這裡顯示為空,表示沒有共享記憶體這個IPC對象
------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
  //這裡顯示為空,表示沒有消息隊列這個IPC對象
           

另外,可以使用ipcs -m/q/s 單獨檢視系統中的共享記憶體,消息隊列和信号量這些IPC對象,這裡就不舉例子了,大家可以自己動手試試。

ipcrm指令可以用來删除系統中具體的IPC對象

ipcrm -m/q/s id 可以用來删除:共享記憶體,消息隊列和信号量這些IPC對象。指令中的id可以通過運作ipcs來檢視,比如, 我們在上面例子中shmid那一列的内容就是共享記憶體的id。

此外,我們在Linux系統中可以通過檢視特殊目錄下的檔案來得到ipc的資訊:

共享記憶體的資訊位于 /proc/sysvipc/shm 檔案中
消息隊列的資訊位于 /proc/sysvipc/msg 檔案中
信号量的資訊位于  /proc/sysvipc/sem  檔案中
           

我們可以使用cat指令來檢視ipc對象的資訊,下面是檢視系統中信号量的例子:

cat /proc/sysvipc/sem   //執行cat指令
key      semid perms      nsems   uid   gid  cuid  cgid      otime      ctime
-                                 
           

各位看官,關于SystemV IPC結構概述的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。

繼續閱讀