linux進程間通訊-XSI IPC

一 什麼是XSI IPC

    有三種 IPC咱們稱做XSI IPC,即消息隊列、信號量以及共享存儲器(共享內存),它們之間有不少類似之處。

二 標識符和鍵

    每一個內核中的 IPC結構(消息隊列、信號量或共享內存)都用一個非負整數的標識符加以引用。
   不管什麼時候建立IPC結構(調用 msgget、semget 或shmget),都應指定一個關鍵字(key),關鍵字的數據類型由系統規定爲 key_t,一般在頭文件<sys/types.h>中被規定爲長整型。關鍵字由內核變換成標識符。
  key的取法有兩種:ftok和IPC_PRIVATE,(網上看到的)

三 兩個進程(服務和客戶)使用同一個IPC結構的方法

(1) 服務器進程能夠指定鍵IPC_PRIVATE建立一個新的IPC結構,將返回的標識符存放在某處(如一個文件)以便和客戶進程取用。也可用父子進程的方式傳遞。
(2) 在一個公用頭文件 中定義 一個客戶進程和服務器進程都承認的鍵。而後服務器進程指定此鍵建立一個新的IPC結構。
(3) 客戶進程和服務器進程認同一個路徑和項目ID(項目ID是0~255間的字符值),接着調用函數ftok將這兩個值變換一個鍵。而後在方法(2)中使用此鍵。
#inlcude <sys/ipc.h>
key_t ftok(const char *path, int id);
path 參數必須引用一個現存文件,當產鍵時,保使用id參數的低8位。若是使用同一項目ID,那麼對於不一樣文件 的兩個路徑可能產相同的鍵。

四 權限結構

XSI IPC爲每個IPC結構設置了一個 ipc _ perm結構。該結構規定了許可權和全部者。主要成員有:
struct ipc_perm {
uid_t uid ; /* owner's effective user id */
gid_t gid ; /* owner's effective group id */
uid_t cuid; /* creator's effective user id */
gid_t cgid ; /* creator's effective group id */
mode_t mode; /* access modes */
ulong seq ; /* slot usage sequence number */
key_t key; /* key */
}
詳細的見<sys/ipc.h>在linux的源碼中能夠找到。
在建立IPC結構時,對全部字段都賦初值。之後,能夠調用msgctl、semctl或shmctl修改uid、gid和mode字段。爲了改變這些值,調用進程必須是IPC結構的建立者或超級用戶。
 
五 Linux中,與IPC相關的命令包括:ipcs、ipcrm(釋放IPC)

IPCS命令是Linux下顯示進程間通訊設施狀態的工具。咱們知道,系統進行進程間通訊(IPC)的時候,可用的方式包括信號量、共享內存、消息隊列、管道、信號(signal)、套接字等形式。使用IPCS能夠查看共享內存、信號量、消息隊列的狀態。linux

例如在CentOS6.0上執行ipcs
具體的用法總結以下:
一、顯示全部的IPC設施
# ipcs -a
二、顯示全部的消息隊列Message Queue
# ipcs -q
三、顯示全部的信號量
# ipcs -s
四、顯示全部的共享內存
# ipcs -m
五、顯示IPC設施的詳細信息
# ipcs -q -i id
id 對應shmid、semid、msgid等。-q對應設施的類型(隊列),查看信號量詳細狀況使用-s,查看共享內存使用-m。
六、顯示IPC設施的限制大小
# ipcs -m -l
-m對應設施類型,可選參數包括-q、-m、-s。
七、顯示IPC設施的權限關係
# ipcs -c
# ipcs -m -c
# ipcs -q -c
# ipcs -s -c
八、顯示最近訪問過IPC設施的進程ID。
# ipcs -p
# ipcs -m -p
# ipcs -q -p
九、顯示IPC設施的最後操做時間
# ipcs -t
# ipcs -q -t
# ipcs -m -t
# ipcs -s -t
十、顯示IPC設施的當前狀態
# ipcs -u
Linux上的ipcs命令,不支持UNIX上的-b、-o指令,一樣UNIX中不支持-l、-u指令,因此在編寫跨平臺的腳本時,須要注意這個問題。服務器

相關文章
相關標籤/搜索