各位看官們,大家好,上一回中咱們說的是程序間通信之臨界資源的例子,這一回咱們說的例子是: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結構概述的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。