程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 一起talk C栗子吧(第九十四回:C語言實例--SystemV IPC結構概述)

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

編輯:關於C語言

一起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      
0x00000000 163840     talk8        600        33554432   2          dest         
0x00000000 3309569    talk8        600        524288     2          dest         
...               //其它的省略
------ Semaphore Arrays --------
key        semid      owner      perms      nsems     
0xcbc384f8 0          tom        600        1         
   //這裡顯示為空,表示沒有共享內存這個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
-876378888          0   600          1  1000  1000  1000  1000 1452336947 1452326

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


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved