Perl:msgsnd的参数

时间:2018-07-08 10:48:40

标签: perl ipc sysv-ipc

我正在维护一些现有代码

我看到了这个片段:

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是什么。我试图理解的代码改为传递消息长度。

这是怎么回事?据我所知,现有代码运行可靠。

3 个答案:

答案 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