ipc 中文man页面

系统
本手册页涉及 System V 进程间通信机制在 Linux 下的实现: 消息队列, 信号灯集合, 以及共享内存段. 下面提到 资源 时, 就是指上面这些通信机制中的一种.

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
该信号灯集合的信号灯数目. 集合中每个信号灯都可以用从 0sem_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).

#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)

责任编辑:韩亚珊 来源: http://cmpp.linuxforum.net
相关推荐

2011-08-24 16:48:36

man中文man

2011-08-15 10:21:09

man中文man

2011-08-11 16:11:49

at中文man

2011-08-25 10:21:56

man.conf中文man

2011-11-01 13:46:50

中文mantac

2011-08-25 16:55:26

gets中文man

2011-08-25 15:49:02

freopen中文man

2011-08-25 16:00:56

fflush中文man

2011-08-25 16:08:55

fsetpos中文man

2011-08-25 15:33:18

exit中文man

2011-08-25 10:55:37

services中文man

2011-08-25 09:35:26

units中文man

2011-08-24 13:57:35

DECLARE中文man

2011-08-11 15:28:43

ali中文man

2011-08-23 17:24:11

userdel中文man

2011-08-23 17:33:22

rdev中文man

2011-08-23 18:05:21

ABORT中文man

2011-08-18 19:15:25

group中文man

2011-08-23 10:17:54

bdflush中文man

2011-08-23 10:48:03

exportfs中文man
点赞
收藏

51CTO技术栈公众号