next up previous contents
下一个: 内核 msg 结构 向上: 内部和用户数据 前一个: 内部和用户数据

消息缓冲区

我们将要介绍的第一个结构是msgbuf结构。这种特定的数据结构可以被认为是消息数据的模板。虽然定义这种类型的结构取决于程序员,但您必须理解,实际上确实存在类型为msgbuf的结构。它在linux/msg.h中声明如下


/* message buffer for msgsnd and msgrcv calls */
struct msgbuf {
    long mtype;         /* type of message */
    char mtext[1];      /* message text */
};

msgbuf结构中有两个成员

mtype

消息类型,用正数表示。这必须是一个正数!

mtext

消息数据本身。

为给定消息分配类型的能力,本质上使您能够在一个队列上多路复用消息。例如,可以为客户端进程分配一个魔术数字,该数字可以用作从服务器进程发送的消息的消息类型。服务器本身可以使用一些其他数字,客户端可以使用这些数字向其发送消息。在另一种情况下,应用程序可以将错误消息标记为消息类型为 1,请求消息可以为类型 2,等等。可能性是无限的。

另一方面,不要被分配给消息数据元素(mtext)的几乎过于描述性的名称所误导。此字段不限于仅保存字符数组,而是可以保存任何形式的任何数据。该字段本身实际上是完全任意的,因为此结构由应用程序员重新定义。考虑以下重新定义


struct my_msgbuf {
        long    mtype;          /* Message type */
        long    request_id;     /* Request identifier */
        struct  client info;    /* Client information structure */
};

在这里我们看到了消息类型,和以前一样,但是结构的其余部分已被另外两个元素替换,其中一个元素是另一个结构!这就是消息队列的魅力所在。内核不对数据进行任何转换。可以发送任何信息。

但是,给定的消息的最大大小确实存在内部限制。在 Linux 中,这在linux/msg.h中声明如下


#define MSGMAX  4056   /* <= 4056 */   /* max size of message (bytes) */

中定义。消息的总大小不能超过 4,056 字节,包括mtype成员,该成员的长度为 4 字节(long).


next up previous contents
下一个: 内核 msg 结构 向上: 内部和用户数据 前一个: 内部和用户数据

转换于
1996 年 3 月 29 日星期五 14:43:04 EST