我正在维护一些现有代码
我看到了这个片段:
msgsnd( $mQueue, pack("l! a*", length($msg), $msg), 0)
|| ... error handling ...
我想理解对pack()的调用是msgsnd的第二个参数。
我发现以下documentation for msgsend
调用System V IPC函数msgsnd将消息MSG发送到 消息队列ID。 MSG必须以本机长整数消息开头 类型,后跟实际消息的长度,然后 最后是消息本身。这种包装可以通过 pack(“ l!a *”,$ type,$ message)。成功则返回true,否则返回false 错误。另请参见perlipc中的SysV IPC和有关文档。 IPC :: SysV和IPC :: Msg。
这将第二个参数打包为$ type,但没有解释$ type是什么。我试图理解的代码改为传递消息长度。
这是怎么回事?据我所知,现有代码运行可靠。
答案 0 :(得分:2)
man page for msgsnd说:“多行文本字段是一个数组(或其他结构),其大小由非负整数值msgsz指定。允许长度为零的消息(即,无多行文本字段)。mtype字段必须具有严格的正整数值。接收过程可以使用此值进行消息选择(请参阅下面的msgrcv()的说明)。“
因此sndmsg本身不使用该类型,并且在接收端可能会或可能不会使用type字段中显示的长度。
答案 1 :(得分:1)
有问题的应用程序决定使用类型字段来存储消息的长度。
(这很奇怪,因为消息的大小已可供读者使用。)
接收方从系统请求消息时,他们可能会将请求限制为特定的消息类型。
如果msgtyp为0,则读取队列中的第一条消息。
如果msgtyp大于0,则读取msgtyp类型的队列中的第一条消息,除非在msgflg中指定了MSG_EXCEPT,在这种情况下,队列中类型不等于msgtyp的第一条消息将为阅读。
如果msgtyp小于0,则将读取队列中类型最小的绝对值小于或等于msgtyp绝对值的第一条消息。
如果接收者为0
指定了msgtyp
,则发送者提供的消息类型不会被系统使用,因此可以用来携带其他信息。
答案 2 :(得分:0)
它创建味精的二进制表示形式: len msg 。通过以下方式进行检查:
perl -e '$a= "abcde"; print(pack("l! a*", length($a), $a))' | od -c
礼物:
0000000 005 \0 \0 \0 \0 \0 \0 \0 a b c d e
0000015