ipc 中文man頁面
NAME
ipc - System V 進(jìn)程間通信機(jī)制
SYNOPSIS 總覽
# include <sys/types.h> # include <sys/ipc.h> # include <sys/msg.h> # include <sys/sem.h> # include <sys/shm.h>
DESCRIPTION
本手冊頁涉及 System V 進(jìn)程間通信機(jī)制在 Linux 下的實(shí)現(xiàn): 消息隊列, 信號燈集合, 以及共享內(nèi)存段. 下面提到 資源 時, 就是指上面這些通信機(jī)制中的一種.
資源訪問權(quán)限
對每個資源, 系統(tǒng)用一個共有的 struct ipc_perm 結(jié)構(gòu)來存放權(quán)限信息, 以確定一個 ipc 操作是否可訪問該資源. 在 <sys/ipc.h> 中定義了 ipc_perm, 其成員如下:
ushort cuid; /* 創(chuàng)建者 uid */
ushort cgid; /* 創(chuàng)建者 gid */
ushort uid; /* 所有者 uid */
ushort gid; /* 所有者 gid */
ushort mode; /* 讀/寫權(quán)限 */
結(jié)構(gòu) ipc_perm 的成員 mode 的低九位定義了對該資源的訪問許可, 以確定一個執(zhí)行了 ipc 系統(tǒng)調(diào)用的進(jìn)程能否訪問該資源. 其解釋如下:
0400 用戶可讀. 0200 用戶可寫. 0040 組成員可讀. 0020 組成員可寫. 0004 其他用戶可讀. 0002 其他用戶可寫.
系統(tǒng)沒有使用執(zhí)行位 0100, 0010 和 0001. 另外, 這里的 "可寫" 等效于信號燈集合里的 "可更改".
在 <sys/ipc.h> 系統(tǒng)頭文件里還定義了如下符號常數(shù):
- IPC_CREAT
- 如果 key 不存在就創(chuàng)建.
- IPC_EXCL
- 如果 key 已經(jīng)存在則失敗.
- IPC_NOWAIT
- 如果請求必須等待, 產(chǎn)生錯誤.
- IPC_PRIVATE
- 私有 key.
- IPC_RMID
- 刪除資源.
- IPC_SET
- 設(shè)置資源選項(xiàng).
- IPC_STAT
- 取得資源選項(xiàng).
請注意 IPC_PRIVATE 是一個 key_t 類型, 而別的符號常數(shù)都是標(biāo)志域,它們的可以或( OR )在一起形成 int 類型.
消息隊列
消息隊列由正整數(shù) (它的 msqid) 唯一標(biāo)識, 其結(jié)構(gòu)體 struct msquid_ds 在 <sys/msg.h> 中定義, 包含如下成員:
struct ipc_perm msg_perm;
ushort msg_qnum; /* 隊列中消息數(shù)目 */
ushort msg_qbytes; /* 一條隊列最大字節(jié)數(shù) */
ushort msg_lspid; /* 上一次 msgsnd 調(diào)用的 pid */
ushort msg_lrpid; /* 上一次 msgrcv 調(diào)用的 pid */
time_t msg_stime; /* 上一次 msgsnd 的時間 */
time_t msg_rtime; /* 上一次 msgrcv 的時間 */
time_t msg_ctime; /* 上一次修改時間 */
- msg_perm
- ipc_perm 結(jié)構(gòu), 指明了對該消息隊列的訪問權(quán)限.
- msg_qnum
- 該隊列當(dāng)前的消息總數(shù).
- msg_qbytes
- 該隊列所允許的消息正文最大字節(jié)總數(shù).
- msg_lspid
- 最后做 msgsnd 系統(tǒng)調(diào)用的進(jìn)程的 ID.
- msg_lrpid
- 最后做 msgrcv 系統(tǒng)調(diào)用的進(jìn)程的 ID.
- msg_stime
- 最近做 msgsnd 系統(tǒng)調(diào)用的時間.
- msg_rtime
- 最近做 msgrcv 系統(tǒng)調(diào)用的時間.
- msg_ctime
- 最后一次改變 msqid_ds 結(jié)構(gòu)成員的時間.
信號燈集合
信號燈集合由正整數(shù) (它的 semid) 唯一標(biāo)識, 并有一個與之關(guān)聯(lián)的結(jié)構(gòu)體 struct semid_ds 它在 <sys/sem.h> 中定義, 包含如下成員:
struct ipc_perm sem_perm;
time_t sem_otime; /* 上一次操作的時間 */
time_t sem_ctime; /* 上一次修改的時間 */
ushort sem_nsems; /* 集合中信號燈數(shù)目 */
- sem_perm
- ipc_perm 結(jié)構(gòu), 指明對該信號燈集合的訪問權(quán)限.
- sem_otime
- 最近做 semop 系統(tǒng)調(diào)用的時間.
- sem_ctime
- 最近做 semctl 系統(tǒng)調(diào)用的時間, 該調(diào)用修改了上面結(jié)構(gòu)的一個成員或者改變了屬于該集合的一個信號燈.
- sem_nsems
- 該信號燈集合的信號燈數(shù)目. 集合中每個信號燈都可以用從 0 到 sem_nsems-1 的一個非負(fù)整數(shù)來引用.
一個信號燈就是一個 struct sem 結(jié)構(gòu), 包含如下成員:
ushort semval; /* 信號燈值 */
short sempid; /* 上一次操作的進(jìn)程的 pid */
ushort semncnt; /* 等待增加 semval 值的進(jìn)程數(shù)目 */
ushort semzcnt; /* 等待 semval = 0 的進(jìn)程數(shù)目 */
- semval
- 該信號燈值,是一個非負(fù)整數(shù).
- sempid
- 最后一個對該信號燈做操作的進(jìn)程 ID.
- semncnt
- 等待增加 semval 的進(jìn)程數(shù).
- semznt
- 等待 semval 變成 0 的進(jìn)程數(shù).
共享內(nèi)存段
共享內(nèi)存段由正整數(shù) (它的 shmid) 唯一標(biāo)識, 有一個關(guān)聯(lián)的結(jié)構(gòu)類型 struct shmid_ds 在 <sys/shm.h> 中定義, 包含如下成員:
struct ipc_perm shm_perm;
int shm_segsz; /* 段尺寸 */
ushort shm_cpid; /* 創(chuàng)建者 pid */
ushort shm_lpid; /* 上一次操作的進(jìn)程的 pid */
short shm_nattch; /* 目前附著的進(jìn)程數(shù)目 */
time_t shm_atime; /* 上一次附著的時間 */
time_t shm_dtime; /* 上一次脫離的時間 */
time_t shm_ctime; /* 上一次修改的時間 */
- shm_perm
- ipc_perm 結(jié)構(gòu), 指明對共享內(nèi)存段的訪問權(quán)限.
- shm_segsz
- 共享內(nèi)存段的大小, 以字節(jié)為單位.
- shm_cpid
- 創(chuàng)建該共享內(nèi)存段的進(jìn)程的 ID.
- shm_lpid
- 最后執(zhí)行 shmat 或者 shmdt 系統(tǒng)調(diào)用的進(jìn)程 ID.
- shm_nattch
- 當(dāng)前對該共享內(nèi)存段的活躍連接數(shù).
- shm_atime
- 最后做 shmat 系統(tǒng)調(diào)用的時間.
- shm_dtime
- 最后做 shmdt 系統(tǒng)調(diào)用的時間.
- shm_ctime
- 最后做 shmctl 系統(tǒng)調(diào)用的時間, 如果該調(diào)用改變了 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).
#p#
NAME
ipc - System V IPC system calls
SYNOPSIS
int ipc(unsigned int call, int first, int second, int third, void *ptr, long fifth);
DESCRIPTION
ipc() is a common kernel entry point for the System V IPC calls for messages, semaphores, and shared memory. call determines which IPC function to invoke; the other arguments are passed through to the appropriate call.
User programs should call the appropriate functions by their usual names. Only standard library implementors and kernel hackers need to know about ipc().
CONFORMING TO
ipc() is Linux specific, and should not be used in programs intended to be portable.
SEE ALSO
msgctl(2), msgget(2), msgrcv(2), msgsnd(2), semctl(2), semget(2), semop(2), shmat(2), shmctl(2), shmdt(2), shmget(2)