首页 文章

与消息队列相关的问题

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

  • 如果我使用struct for message队列是正确的,如下所述

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

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

2 回答

  • 0

    在初学者语言中,msgtype字段允许开发人员在设计如何处理队列中的消息时具有一定的灵活性 . 所有类型都是一个整数,表示您要区分的内容 . 一些示例用途是:

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

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

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

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

    chisaycock发布了阅读队列的规则 . 乍一看似乎令人生畏,但它真的很有意义 .

  • 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) .

相关问题