System V包含三种IPC机制(消息队列、信号量和共享内存),通常称为System V IPC。后来被收录到Unix的XSI标准之中故又称为XSI IPC。所以当你看到System V IPC 和 XSI IPC的时候实际上指的是同一种东西。
在Linux中,描叙这几种System V IPC对象的数据结构中都包含一个ipc_perm结构,这个结构中包含了对象的所有者,创建者和进程的用户ID,组ID,还包括对象的访问权限和IPC对象关键字(键值).__key是ipc对象(消息队列、信号量和共享内存)对应的句柄,是IPC对象的唯一标识符。
三种IPC机制都有对应的结构体,这些结构体中有一个共同的成员就是这个ipc_perm,用来标识IPC对象的权限。
ipc_perm
这是一个结构体。他的英文含义是:ipc permission(IPC权限)
struct ipc_perm {
key_t __key; /* key */
uid_t uid; /* 所有者的有效用户ID */
gid_t gid; /* 所有者的有效组ID */
uid_t cuid; /* 创造者的有效用户ID */
gid_t cgid; /* 创造者的有效组ID */
unsigned short mode; /* 权限 */
unsigned short __seq; /* 可忽略 */
};
消息队列的结构
struct msqid_ds {
struct ipc_perm msg_perm; /* IPC对象结构体 */
struct msg *msg_first; /*消息队列头指针*/
struct msg *msg_last; /*消息队列尾指针*/
__kernel_time_t msg_stime; /*最后一次插入消息队列消息的时间*/
__kernel_time_t msg_rtime; /*最后一次接收消息即删除队列中一个消息的时间*/
__kernel_time_t msg_ctime; /* 最后修改队列的时间*/
unsigned long msg_lcbytes; /* Reuse junk fields for 32 bit */
unsigned long msg_lqbytes; /* ditto */
unsigned short msg_cbytes; /*队列上所有消息总的字节数 */
unsigned short msg_qnum; /*在当前队列上消息的个数 */
unsigned short msg_qbytes; /* 队列最大的字节数 */
__kernel_ipc_pid_t msg_lspid;/* 发送最后一条消息的进程的pid */