首页 > 解决方案 > Perl:msgsnd 的参数

问题描述

我正在维护一些现有的代码

我看到这个片段:

msgsnd( $mQueue, pack("l! a*", length($msg), $msg), 0) 
                                   || ... error handling ...

我想理解对 pack() 的调用作为 msgsnd 的第二个参数。

我找到了msgsend的以下文档

调用 System V IPC 函数 msgsnd 将消息 MSG 发送到消息队列 ID。MSG 必须以本机长整数消息类型开头,后跟实际消息的长度,最后是消息本身。这种打包可以通过 pack("l!a*", $type, $message) 来实现。成功返回真,错误返回假。另请参阅 perlipc 中的 SysV IPC 以及 IPC::SysV 和 IPC::Msg 的文档。

这给出了要打包为 $type 的第二个参数,但没有解释 $type 是什么。我试图理解的代码改为传递消息长度。

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

标签: perlipcsysv-ipc

解决方案


msgsnd的手册页说“mtext 字段是一个数组(或其他结构),其大小由 msgsz 指定,一个非负整数值。允许长度为零的消息(即,没有 mtext 字段)。mtype 字段必须具有严格的正整数值。这个值可以被接收进程用于消息选择(见下面 msgrcv() 的描述)。

因此 sndmsg 本身不使用类型,并且出现在类型字段中的长度可能会或可能不会在接收端使用。


推荐阅读