我们将要介绍的第一个结构是msgbuf结构。这种特定的数据结构可以被认为是消息数据的模板。虽然定义这种类型的结构取决于程序员,但您必须理解,实际上确实存在类型为msgbuf的结构。它在linux/msg.h中声明如下
/* message buffer for msgsnd and msgrcv calls */ struct msgbuf { long mtype; /* type of message */ char mtext[1]; /* message text */ };
消息类型,用正数表示。这必须是一个正数!
消息数据本身。
为给定消息分配类型的能力,本质上使您能够在一个队列上多路复用消息。例如,可以为客户端进程分配一个魔术数字,该数字可以用作从服务器进程发送的消息的消息类型。服务器本身可以使用一些其他数字,客户端可以使用这些数字向其发送消息。在另一种情况下,应用程序可以将错误消息标记为消息类型为 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) */