# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/msg.h>
# include <sys/sem.h>
# include <sys/shm.h>
本手冊頁涉及 System V 程序間通訊機制在 Linux 下的實現: 訊息佇列, 訊號燈集合, 以及共享記憶體段. 下面提到 資源 時, 就是指上面這些通訊機制中的一種.
對每個資源, 系統用一個共有的 struct ipc_perm 結構來存放許可權資訊, 以確定一個 ipc 操作是否可訪問該資源. 在 <sys/ipc.h> 中定義了 ipc_perm, 其成員如下:
ushort cuid; /* 建立者 uid */
ushort cgid; /* 建立者 gid */
ushort uid; /* 所有者 uid */
ushort gid; /* 所有者 gid */
ushort mode; /* 讀/寫許可權 */
結構 ipc_perm 的成員 mode 的低九位定義了對該資源的訪問許 可, 以確定一個執行了 ipc 系統呼叫的程序能否訪問該資源. 其解 釋如下:
0400 使用者可讀.
0200 使用者可寫.
0040 組成員可讀.
0020 組成員可寫.
0004 其他使用者可讀.
0002 其他使用者可寫.
系統沒有使用執行位 0100, 0010 和 0001. 另外, 這裡的 "可寫" 等 效於訊號燈集合裡的 "可更改".
在 <sys/ipc.h> 系統標頭檔案裡還定義瞭如下符號常數:
- IPC_CREAT
- 如果 key 不存在就建立.
- IPC_EXCL
- 如果 key 已經存在則失敗.
- IPC_NOWAIT
- 如果請求必須等待, 產生錯誤.
- IPC_PRIVATE
- 私有 key.
- IPC_RMID
- 刪除資源.
- IPC_SET
- 設定資源選項.
- IPC_STAT
- 取得資源選項.
請注意 IPC_PRIVATE 是一個 key_t 型別, 而別的符號常數都是標誌域,它們的可以或( OR )在一起形成 int 型別.
訊息佇列由正整數 (它的 msqid) 唯一標識, 其結構體 struct msquid_ds 在 <sys/msg.h> 中定義, 包含如下成員:
struct ipc_perm msg_perm;
ushort msg_qnum; /* 佇列中訊息數目 */
ushort msg_qbytes; /* 一條佇列最大位元組數 */
ushort msg_lspid; /* 上一次 msgsnd 呼叫的 pid */
ushort msg_lrpid; /* 上一次 msgrcv 呼叫的 pid */
time_t msg_stime; /* 上一次 msgsnd 的時間 */
time_t msg_rtime; /* 上一次 msgrcv 的時間 */
time_t msg_ctime; /* 上一次修改時間 */
- msg_perm
- ipc_perm 結構, 指明瞭對該訊息佇列的訪問許可權.
- msg_qnum
- 該隊列當前的訊息總數.
- msg_qbytes
- 該佇列所允許的訊息正文最大位元組總數.
- msg_lspid
- 最後做 msgsnd 系統呼叫的程序的 ID.
- msg_lrpid
- 最後做 msgrcv 系統呼叫的程序的 ID.
- msg_stime
- 最近做 msgsnd 系統呼叫的時間.
- msg_rtime
- 最近做 msgrcv 系統呼叫的時間.
- msg_ctime
- 最後一次改變 msqid_ds 結構成員的時間.
訊號燈集合由正整數 (它的 semid) 唯一標識, 並有一個與之關聯的結構體 struct semid_ds 它在 <sys/sem.h> 中定義, 包含如下成員:
struct ipc_perm sem_perm;
time_t sem_otime; /* 上一次操作的時間 */
time_t sem_ctime; /* 上一次修改的時間 */
ushort sem_nsems; /* 集合中訊號燈數目 */
- sem_perm
- ipc_perm 結構, 指明對該訊號燈集合的訪問許可權.
- sem_otime
- 最近做 semop 系統呼叫的時間.
- sem_ctime
- 最近做 semctl 系統呼叫的時間, 該呼叫修改了上面結構的一個成員 或者改變了屬於該集合的一個訊號燈.
- sem_nsems
- 該訊號燈集合的訊號燈數目. 集合中每個訊號燈都可以用從 0 到 sem_nsems-1 的一個非負整數來引用.
一個訊號燈就是一個 struct sem 結構, 包含如下成員:
ushort semval; /* 訊號燈值 */
short sempid; /* 上一次操作的程序的 pid */
ushort semncnt; /* 等待增加 semval 值的程序數目 */
ushort semzcnt; /* 等待 semval = 0 的程序數目 */
- semval
- 該訊號燈值,是一個非負整數.
- sempid
- 最後一個對該訊號燈做操作的程序 ID.
- semncnt
- 等待增加 semval 的程序數.
- semznt
- 等待 semval 變成 0 的程序數.
共享記憶體段由正整數 (它的 shmid) 唯一標識, 有一個關聯的結構型別 struct shmid_ds 在 <sys/shm.h> 中定義, 包含如下成員:
struct ipc_perm shm_perm;
int shm_segsz; /* 段尺寸 */
ushort shm_cpid; /* 建立者 pid */
ushort shm_lpid; /* 上一次操作的程序的 pid */
short shm_nattch; /* 目前附著的程序數目 */
time_t shm_atime; /* 上一次附著的時間 */
time_t shm_dtime; /* 上一次脫離的時間 */
time_t shm_ctime; /* 上一次修改的時間 */
- shm_perm
- ipc_perm 結構, 指明對共享記憶體段的訪問許可權.
- shm_segsz
- 共享記憶體段的大小, 以位元組為單位.
- shm_cpid
- 建立該共享記憶體段的程序的 ID.
- shm_lpid
- 最後執行 shmat 或者 shmdt 系統呼叫的程序 ID.
- shm_nattch
- 當前對該共享記憶體段的活躍連線數.
- shm_atime
- 最後做 shmat 系統呼叫的時間.
- shm_dtime
- 最後做 shmdt 系統呼叫的時間.
- shm_ctime
- 最後做 shmctl 系統呼叫的時間, 如果該呼叫改變了 shmid_ds.
ftok(3)EN, msgctl(2)EN, msgget(2)EN, msgrcv(2)EN, msgsnd(2)EN, semctl(2)EN, semget(2)EN, semop(2)EN, shmat(2)EN, shmctl(2)EN, shmget(2)EN, shmdt(2)EN.
http://cmpp.linuxforum.net
本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh