曲径通幽论坛

标题: 消息队列基本概念 [打印本页]

作者: beyes    时间: 2009-9-3 10:44
标题: 消息队列基本概念
消息队列是一个存放在内核中的消息链表,每个消息队列由消息队列标识符标识。与管道不同的是,消息队列存放在内核中,只有在内核重启(操作系统重启)或显式地删除一个消息队列时,该消息队列才会被真正的删除。

操作消息队列时,需要用到一些数据结构,下面是几个重要的数据结构。

1、消息缓冲结构
向消息队列发送消息时,必须组成合理的数据结构。Linux 系统定义了一个模板数据结构 msgbuf:
#include <linux/msg.h>

/* message buffer for msgsnd and msgrcv calls */
struct msgbuf {
        long mtype;         /* type of message */
        char mtext[1];      /* message text */
};
上面结构体中的 mtype 字段代表消息类型。给消息指定类型,可以使得消息在一个队列中重复使用。mtext 字段指消息内容。

注意:mtext 虽然定义为 char 类型,但并不标识消息只能是一个字符,消息内容可以为任意类型,由用户根据需要定义,如下是自定义的一个消息结构:
struct sefdefbuf {
        long mtype;         
        struct student stu;
};

消息队列中的消息是受大小限制的,由 <linux/msg.h> 中的宏 MSGMAX 给出消息的最大长度。( #define MSGMAX  8192 )

2、msqid_ds 内核数据结构

Linux 内核中,每个消息队列都维护一个结构体 msqid_ds ,此结构体保存着消息队列当前的状态信息。该结构体定义在头文件 linux/msg.h 中,具体定义如下:

/* Obsolete, used only for backwards compatibility and libc5 compiles */
struct msqid_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 32 bit */
         unsigned long  msg_lqbytes;     /* ditto */
         unsigned short msg_cbytes;      /* current number of bytes on queue */
         unsigned short msg_qnum;        /* number of messages in queue */
         unsigned short msg_qbytes;      /* max number of bytes on queue */
         __kernel_ipc_pid_t msg_lspid;   /* pid of last msgsnd */
         __kernel_ipc_pid_t msg_lrpid;   /* last receive pid */
};
3、ipc_perm 内核数据结构

结构体 ipc_perm 保存着消息队列的一些重要信息,比如消息队列关联的键值,消息队列的用户 ID ,组 ID ,它定义在头文件 linux/ipc.h 中:
/* Obsolete, used only for backwards compatibility and libc5 compiles */
struct ipc_perm
{
        __kernel_key_t  key;
        __kernel_uid_t  uid;
        __kernel_gid_t  gid;
        __kernel_uid_t  cuid;
        __kernel_gid_t  cgid;
        __kernel_mode_t mode;
        unsigned short  seq;
};
几个主要字段的含义如下:
关于消息队列的创建与读写:http://www.groad.net/bbs/read.php?tid-1124.html





欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2