与消息队列相关的问题

时间:2013-07-07 13:46:14

标签: c linux unix queue posix

  1. msgrcv系统调用中的msgtype是什么? msg类型的含义是什么?请在厨师解释langauge ?? int msgrcv(int msqid,void * msgp,size_t msgsz,        long msgtyp,int msgflg);

  2. 如果我使用struct for message queue,这是正确的

    struct mybuff {  长mtype  int标志  char buff [50] } BUF

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

2 个答案:

答案 0 :(得分:1)

来自documentation

  

参数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)

答案 1 :(得分:0)

在初学者语言中,msgtype字段使开发人员可以灵活地设计如何处理队列中的消息。所有类型都是一个整数,表示您要区分的内容。一些示例用法是:

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

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

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

(d)msgtypes可用于将常规队列转换为粗略但有效的优先级队列。例如,您可能拥有所有Order事务的队列,但您可以设计msgtype协议,以便首先根据msgtype处理重要客户。

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