Perl:msgsnd 的参数
Perl: Parameters to msgsnd
我正在维护一些现有代码
我看到这个片段:
msgsnd( $mQueue, pack("l! a*", length($msg), $msg), 0)
|| ... error handling ...
我想将对 pack() 的调用理解为 msgsnd 的第二个参数。
我找到以下 documentation for msgsend
Calls the System V IPC function msgsnd to send the message MSG to the
message queue ID. MSG must begin with the native long integer message
type, be followed by the length of the actual message, and then
finally the message itself. This kind of packing can be achieved with
pack("l! a*", $type, $message) . Returns true if successful, false on
error. See also SysV IPC in perlipc and the documentation for
IPC::SysV and IPC::Msg .
这给出了第二个参数打包为$type,但没有解释$type是什么。我试图理解的代码传递了消息长度。
这是怎么回事?据我所知,现有代码工作可靠。
它创建消息的二进制表示:len msg。通过以下方式检查:
perl -e '$a= "abcde"; print(pack("l! a*", length($a), $a))' | od -c
给出:
0000000 005 [=11=] [=11=] [=11=] [=11=] [=11=] [=11=] [=11=] a b c d e
0000015
man page for msgsnd 表示 "The mtext field is an array (or other structure) whose size is specified by msgsz, a nonnegative integer value. Messages of zero length (i.e., no mtext field) are permitted. The mtype field must have a strictly positive integer value. This value can be used by the receiving process for message selection (see the description of msgrcv() below)."
因此 sndmsg 本身不使用类型,类型字段中出现的长度可能会也可能不会在接收端使用。
有问题的应用程序决定使用类型字段来存储消息的长度。
(这很奇怪,因为 reader 已经可以使用消息的大小。)
当接收者从系统请求消息时,他们可以将请求限制为特定的消息类型。
If msgtyp is 0, then the first message in the queue is read.
If msgtyp is greater than 0, then the first message in the queue of type msgtyp is read, unless MSG_EXCEPT was specified in msgflg, in which case the first message in the queue of type not equal to msgtyp will be read.
If msgtyp is less than 0, then the first message in the queue with the lowest type less than or equal to the absolute value of msgtyp will be read.
如果接收方指定0
为msgtyp
,那么系统不使用发送方提供的消息类型,因此可以用来携带其他信息。
我正在维护一些现有代码
我看到这个片段:
msgsnd( $mQueue, pack("l! a*", length($msg), $msg), 0)
|| ... error handling ...
我想将对 pack() 的调用理解为 msgsnd 的第二个参数。
我找到以下 documentation for msgsend
Calls the System V IPC function msgsnd to send the message MSG to the message queue ID. MSG must begin with the native long integer message type, be followed by the length of the actual message, and then finally the message itself. This kind of packing can be achieved with pack("l! a*", $type, $message) . Returns true if successful, false on error. See also SysV IPC in perlipc and the documentation for IPC::SysV and IPC::Msg .
这给出了第二个参数打包为$type,但没有解释$type是什么。我试图理解的代码传递了消息长度。
这是怎么回事?据我所知,现有代码工作可靠。
它创建消息的二进制表示:len msg。通过以下方式检查:
perl -e '$a= "abcde"; print(pack("l! a*", length($a), $a))' | od -c
给出:
0000000 005 [=11=] [=11=] [=11=] [=11=] [=11=] [=11=] [=11=] a b c d e
0000015
man page for msgsnd 表示 "The mtext field is an array (or other structure) whose size is specified by msgsz, a nonnegative integer value. Messages of zero length (i.e., no mtext field) are permitted. The mtype field must have a strictly positive integer value. This value can be used by the receiving process for message selection (see the description of msgrcv() below)."
因此 sndmsg 本身不使用类型,类型字段中出现的长度可能会也可能不会在接收端使用。
有问题的应用程序决定使用类型字段来存储消息的长度。
(这很奇怪,因为 reader 已经可以使用消息的大小。)
当接收者从系统请求消息时,他们可以将请求限制为特定的消息类型。
If msgtyp is 0, then the first message in the queue is read.
If msgtyp is greater than 0, then the first message in the queue of type msgtyp is read, unless MSG_EXCEPT was specified in msgflg, in which case the first message in the queue of type not equal to msgtyp will be read.
If msgtyp is less than 0, then the first message in the queue with the lowest type less than or equal to the absolute value of msgtyp will be read.
如果接收方指定0
为msgtyp
,那么系统不使用发送方提供的消息类型,因此可以用来携带其他信息。