消息队列
消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。用户进程可以向消息队列添加消息,也可以向消息队列读取消息。
同管道文件相比,消息队列中的每个消息指定特定的消息类型,接收的时候可以不需要按照队列次序读取,可以根据自定义类型接收特定类型的消息。我们可以将消息看成一个具有特定格式以及特定的优先级的一个记录,对消息队列有写权限的进程可以向消息队列中按照一定规则添加消息,对于消息队列有读权限的进程可以从消息队列中读取消息。
每个队列都有一个msgqid_ds结构与其相关联:
struct msqid_ds {
struct ipc_perm msg_perm;
msgqnum_t msg_qnum; /* # of messages on queue */ 0
msglen_t msg_qbytes; /* max # of bytes no queue */
pid_t msg_lspid; /* pid of last msgsnd() */ 0
pid_t msg_lrpid; /* pid of last msgrcv() */ 0
time_t msg_stime; /* last-msgsnd() time */ 0
time_t msg_rtime; /* last-msgrcv() time */ 0
time_t msg_ctime; /* last-change time */
...
};
此结构规定了队列的当前状态,在初始化的时候将msg_ctime设置为当前时间。msg_qbytes设置为系统限制值。
消息队列特点
- 消息队列是面向记录的,其中的消息具有特定的格式和特定的优先级
- 消息队列独立于发送与接收进程,即便进程终止时,消息队列及其内容都不会被改变
- 消息队列可以实现随机查询,不一定非得按照队列的先进先出获取消息,可以按照消息类型获取
消息队列的操作
1:消息队