perl - 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 是什么。我试图理解的代码改为传递消息长度。
这是怎么回事?据我所知,现有代码运行可靠。
解决方案
msgsnd的手册页说“mtext 字段是一个数组(或其他结构),其大小由 msgsz 指定,一个非负整数值。允许长度为零的消息(即,没有 mtext 字段)。mtype 字段必须具有严格的正整数值。这个值可以被接收进程用于消息选择(见下面 msgrcv() 的描述)。
因此 sndmsg 本身不使用类型,并且出现在类型字段中的长度可能会或可能不会在接收端使用。
推荐阅读
- css - 当用户向下滚动时,React 上的移动设备全屏背景视频在底部有额外的空间
- javascript - 如何通过百分比等计算字段对javascript中的数组进行排序
- rpa - 如何在不更改默认变量设置的情况下在任何地方自动将日期格式更改为 mmm-dd-yyyy?
- python - 查找显示特定值的所有组
- android-studio - 为什么我只看到官方 android 类的反编译源代码?
- c++ - stof()/stoi() 的 C++ 无效参数(std::invalid_argument: stoi: 无转换)
- php - Laravel Collection::toArray() 触发额外的数据库查询
- pytorch - 如何为 PyTorch 中的特定张量释放 GPU 内存?
- javascript - Gatsby 无法从 GraphQL 查询中创建多个子部分?
- javascript - 您如何从 monaco 编辑器中检索主题?