table of contents
IPC(5) | Linux Programmer's Manual | 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跋¶
本页面中文版由中文 man 手册页计划提供。中文 man 手册页计划:https://github.com/man-pages-zh/manpages-zh
November 1, 1993 | Linux 0.99.13 |