System V消息队列是Open Group定义的XSI,不属于POSIX标准。System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的系统内核中,后来商用UNIX系统基本都加入了System V IPC的功能。
System V消息队列相对于POSIX消息队列的区别主要是:
POSIX消息队列的读操作总是返回消息队列中优先级最高的最早消息,而对于System V消息队列可以返回任意指定优先级(通过消息类型)的消息。
当向一个空消息队列中写入一个消息时,POSIX消息队列允许产生一个信号或启动一个线程,System V消息队列不提供类似的机制。
系统内核都会为每一个System V消息队列维护一个信息结构,在Linux 2.6.18中的定义如下:
<bits/msq.h> struct msqid_ds { struct ipc_perm msg_perm; /*IPC对象的属性信息和访问权限 */ __time_t msg_stime; /* time of last msgsnd command */ __time_t msg_rtime; /* time of last msgrcv command */ __time_t msg_ctime; /* time of last change */ unsigned long int __msg_cbytes; /* 当前队列中消息的字节数 */ msgqnum_t msg_qnum; /* 当前队列中消息的个数 */ msglen_t msg_qbytes; /* 队列允许存放的最大字节数 */ __pid_t msg_lspid; /* pid of last msgsnd() */ __pid_t msg_lrpid; /* pid of last msgrcv() */ //下面是保留字段 #if __WORDSIZE == 32 unsigned long int __unused1; unsigned long int __unused2; unsigned long int __unused3; #endif unsigned long int __unused4; unsigned long int __unused5; }; |
消息队列的结构可能的设计如下:
1 System V消息队列的创建和打开
System V消息队列的创建和使用会使用下面的函数接口:
#include <sys/msg.h>
int msgget(key_t key, int oflg);
//成功返回非负消息队列描述符,失败返回-1