IPC(5)

NAME
ipc - System V 進程間通信機制

SYNOPSIS 總覽
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/msg.h>
# include <sys/sem.h>
# include <sys/shm.h>

DESCRIPTION
本手冊頁涉及 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), msgctl(2), msgget(2), msgrcv(2), msgsnd(2), semctl(2), semget(2), semop(2), shmat(2), shmctl(2), shmget(2), shmdt(2).

[中文版維護人]
name <email>

[中文版最新更新]
2001/02/02

《中國 Linux 論壇 man 手冊頁翻譯計劃》:
http://cmpp.linuxforum.net