各位看官們,大家好,上一回中咱們說的是進程間通信之臨界資源的例子,這一回咱們說的例子是:SystemV IPC結構概述。閒話休提,言歸正轉。讓我們一起talk C栗子吧!
看官們, 我們通常所說的IPC是進程間通信的簡稱,這只是一個抽象的稱呼,今天說的SystemV IPC是具體的一種IPC,因為它廣泛應用於Unix SystemV版本中,所以取名叫作SystemV IPC。當然了,我們使用的Linux系統中也支持該類型的IPC。接下來我們詳細介紹SystemV IPC。
SystemV IPC是在系統內核中實現的,它是內核中的一種結構,該結構是一種抽象的概念,我們可以把它實現為具體的對象。比如,電腦是一個抽象的概念,而台式電腦,筆記本電腦和平板電腦就是具體的一種電腦產品。與SystemV IPC結構有關的SystemV IPC對象有:共享內存,消息隊列和信號量,我們會在後面章回中介紹這些具體的SystemV IPC對象。
在內核中需要使用標識符來使用IPC結構,標識符類似於我們使用文件時的文件描述符,它是一個非負整數值,不過它的值通常都是比較大的數值。標識符是內核裡的東西。我們通常沒有辦法直接使用,因此需要使用鍵(key)來與標識符建立聯系,這樣我們就可以通過操作鍵來操作SystemV IPC在內核中的結構,進而操作SystemV IPC對象,比如共享內存。
在程序中我們可以任意指定一個整數值來在當鍵值,不過該方法不太好。常用的是使用IPC_PRIVATE鍵來創建IPC對象。或者使用ftok函數來生成唯一的鍵。
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對象必須包含的。
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結構概述的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。