msgrcv系统调用中的msgtype是什么? msg类型的含义是什么?请在厨师解释langauge ?? int msgrcv(int msqid,void * msgp,size_t msgsz, long msgtyp,int msgflg);
如果我使用struct for message queue,这是正确的
struct mybuff { 长mtype int标志 char buff [50] } BUF
并且在发送msgsnd时(msgid,& buf,sizeof(buf),0)
答案 0 :(得分: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)
。
答案 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发布了阅读队列的规则。乍一看似乎令人生畏,但当它沉入其中时它确实有意义。