消息队列的特性:
1.消息队列是内核中的链表;
2.用户将数据传送给内核后,内核重新添加一些如用户ID、组ID、读写进程的ID和优先级等相关信息后并打成一个数据包称为消息;
3.允许一个或者多个进程往消息队列中写消息和读消息,但一个消息只能被一个进程读取,读取完毕后就自动删除;
4.消息队列具有一定的FIFO特性,消息可以按照顺序发送到队列中,也可以几种不同的方式从队列中读取。每一个消息队列在内核中用一个唯一的IPC标识ID表示;
5.消息队列的实现包括创建和打开队列、发送消息、读取消息和控制消息队列四种操作。消息队列属性结构体
struct msqid_ds {
struct ipc_perm msg_perm; /* Ownership and permissions*/
unsigned long __msg_cbytes; /* Current number of bytes in queue (non-standard) */
msgqnum_t msg_qnum; /* Current number of messages in queue */
msglen_t msg_qbytes; /* Maximum number of bytesallowed in queue */
pid_t msg_lspid; /* PID of last msgsnd() */
pid_t msg_lrpid; /* PID of last msgrcv() */
time_t msg_stime; /* Time of last msgsnd() */
time_t msg_rtime; /* Time of last msgrcv() */
time_t msg_ctime; /* Time of last change */
};
创建和打开消息队列
#include <sys/msg.h>
int msgget(key_t key, int flag);
返回:成功返回内核中消息队列的标识符ID,出错返回-1参数:
key:用户指定的消息队列键值
flag:IPC_CREAT, IPC_EXCL等权限组合若创建消息队列,key可指定键值,也可将之设置为IPC_PRIVATE。若打开进行查询,则key不能为0,必须是一个非零的值,否则查询不到。
消息队列控制
#include <sys/msg.h>
int msgctl(int msgid, int cmd, struct msqid_ds *buf);返回:成功返回0,出错-1
参数:
msgid:消息队列ID
buf:消息队列属性指针cmd:
IPC_STAT 获取消息队列的属性,取此队列的msqid_ds结构,并将其存放在buf指向的结构中;
IPC_SET 设置属性,按由buf指向的结构中的值,设置与此队列相关的结构中的字段;