一、 概念
消息队列就是一个消息的链表。对消息队列有写权限的进程可以向其中按照一定的规则添加新消息;对消息队列有读权限的进程可以从消息队列中读出消息。消息队列是随内核持续的。下面介绍三个概念:
1;随进程持续:IPC一直存在,直至打开IPC对象的最后一个进程关闭该对象为止,如管道和有名管道
2;随内核持续:IPC一直持续到内核重新自举或者显示删除对象为止。如:消息队列,信号量,共享内存
3;随文件系统持续:IPC一直持续的显示删除该对象为止
System V消息队列目前被大量使用。
二、 消息队列的信息
每个消息队列都有一个队列头,用结构struct msg_queue来描述。队列头中包含了该消息队列的大量信息,包括消息队列键值、用户ID、组ID、消息队列中消息数目等等,甚至记录了最近对消息队列读写进程的ID。读者可以访问这些信息,也可以设置其中的某些信息。这个结构存于系统空间。
struct msg_queue {
structkern_ipc_perm q_perm;
time_tq_stime; /* last msgsndtime */
time_tq_rtime; /* last msgrcvtime */
time_tq_ctime; /* last changetime */
unsignedlong q_cbytes; /* current number of bytes on queue*/
unsignedlong q_qnum; /* number of messages inqueue */
unsignedlong q_qbytes; /* max number of bytes on queue */
pid_tq_lspid; /* pid oflast msgsnd */
pid_tq_lrpid; /* lastreceive pid */
structlist_head q_messages;
structlist_head q_receivers;
structlist_head q_senders;
};
结构msqid_ds用来设置或返回消息队列的信息,存在于用户空间;
structmsqid_ds{
struct ipc_perm msg_perm;
struct msg *msg_first; /* first message on queue,unused*/
struct msg *msg_last; /* last message in queue,unused*/
__kernel_time_t msg_stime; /* last msgsnd time */
__kernel_time_t msg_rtime; /* last msgrcv time */
__kernel_time_t msg_ctime; /* last change time */
unsigned long msg_lcbytes; /* Reuse junk fields for 32bit */
unsigned long msg_lqbytes; /* ditto */
unsigned short msg_cbytes; /* current number of byteson queue */
unsigned short msg_qnum; /* number of messages in queue*/
unsigned short msg_qbytes; /* max number of bytes onqueue */
__kernel_ipc_pid_t msg_lspid; /* pid of last msgsnd */
__kernel_ipc_pid_t msg_lrpid; /* last receive pid*/
};
三、 打开创建消息队列
消息队列的内核持续性要求每个消息队列都在系统范围内对应唯一的键值,所以,要获得一个消息队列的描述字,只需提供该消息队列的键值即可。msgget用于创建一个消息队列或打开一个现存的队列。
名称:: |