发布于 2013-07-07 13:56:29
来自文档
参数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-08 20:47:30
在初学者语言中,msgtype字段允许开发人员在设计队列中的消息处理方式方面具有一定的灵活性。所有类型都是一个整数,表示要区分的内容。一些例子的用途是:
(a)一种信息-例如购买交易与退款交易。这允许在同一个队列中有两种(或更多的)消息。
(b)关于应采用何种程序处理信息的指标。msgrcv函数只用于读取特定类型的消息。因此,例如,客户端可以将购买、出售、退款、状态等各种消息写入单个队列。但是,多个进程可以读取该队列,只查找它们感兴趣的消息,例如,BuyPgm只读取购买事务。
(c)经过充分的预先考虑,msgtype可以用于客户机和服务器都可以共享相同队列的方式。通常,队列是先入先出机制,因此客户端通常会读取一个队列并写入一个单独的队列,这意味着需要处理其他进程。他们需要两个队列来避免阅读他们写的消息。Msgtype允许一种绕过这种情况的方法。例如,客户端可以编写各种消息,其msgtype介于1..100之间。某些进程(Es)可以处理这些消息,然后将结果响应消息写入msgtype 200..300。然后,原始客户端可以通过只读取200-300范围内的响应消息,在它最初编写的队列上接收其响应消息。(或者您创建的任何msgtype协议。)
(d) msgtype可用于将常规队列转换为简单但有效的优先级队列。例如,您可能有一个包含所有订单事务的队列,但是您设计了msgtype协议,以便您的重要客户首先根据msgtype进行处理。
吉塞科克发布了读取队列的规则。乍一看,这似乎令人望而生畏,但当它沉入其中时,它实际上是有意义的。
https://stackoverflow.com/questions/17512703
复制相似问题