0
  1. msgrcv 系统调用中的 msgtype 是什么?味精类型的含义是什么?请用初学者语言解释?int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

  2. 如果我将结构用于消息队列是否正确,如下所述

    struct mybuff { long mtype int flag char buff[50] }buf

    并且在发送 msgsnd(msgid,&buf,sizeof(buf),0)

4

2 回答 2

1

文档中:

参数 msgtyp 指定请求的消息类型,如下所示:

*

如果 msgtyp 为 0,则读取队列中的第一条消息。

*

如果 msgtyp 大于 0,则读取队列中类型为 msgtyp 的第一条消息,除非在 msgflg 中指定了 MSG_EXCEPT,在这种情况下,将读取类型不等于 msgtyp 的队列中的第一条消息。

*

如果 msgtyp 小于 0,则将读取队列中最低类型小于或等于 msgtyp 绝对值的第一条消息。

同样来自文档,的第二个参数msgsnd()必须是指向此结构的指针:

struct msgbuf {
    long mtype;       /* message type, must be > 0 */
    char mtext[1];    /* message data */
};

mtext 字段是一个数组(或其他结构),其大小由非负整数值 msgsz 指定。

所以你的第三个参数不是整个结构的大小,而是mtype. 所以它是sizeof(buf)-sizeof(long)

于 2013-07-07T13:56:29.187 回答
0

在初学者语言中,msgtype 字段让开发人员可以灵活地设计队列中消息的处理方式。所有类型都是一个整数,代表你想要区分的东西。一些示例用途是:

(a)一种消息——例如购买交易与退款交易。这允许同一队列中有两种(或可能更多)类型的消息。

(b) 关于应该由哪个进程处理消息的指示符。该msgrcv函数可用于仅读取特定类型的消息。因此,例如,客户可以将购买、出售、退款、状态等各种消息写入单个队列。然而,多个进程可以读取该队列,仅查找他们感兴趣的消息,例如 BuyPgm 将只读取 Buy 交易。

(c) 有足够的远见,可以使用 msgtype 以使客户端和服务器都可以共享同一个队列。通常队列是先进先出机制,因此客户端通常会读取一个队列并写入一个单独的队列,以供其他进程处理。他们需要两个队列来避免阅读他们写的消息。Msgtypes 允许解决这个问题。例如,客户端可以使用 1..100 之间的 msgtypes 编写各种消息。某些进程可以处理这些消息,然后将生成的响应消息写入 msgtype 200..300。然后,原始客户端可以通过仅读取 200-300 范围内的消息,在其最初写入的同一队列中接收其响应消息。(或您创建的任何 msgtype 协议。)

(d) msg​​types 可用于将常规队列转换为粗略但有效的优先级队列。例如,您可能有一个包含所有订单交易的队列,但您设计了 msgtype 协议,以便您的重要客户首先根据 msgtype 得到处理。

chisaycock发布了阅读队列的规则。乍一看似乎令人生畏,但当它沉入其中时,它实际上是有道理的。

于 2013-07-08T20:47:30.867 回答