Solaris(64 位)开发者指南

进程间通信

以下进程间通信 (interprocess communication, IPC) 元语仍适用于 64 位和 32 位进程之间的通信。

尽管所有这些元语都允许在 32 位和 64 位进程之间进行通信,但是可能需要明确执行一些步骤来确保在进程间交换的数据可以由所有这些元语正确解释。例如,两个进程共享由 C 数据结构所描述的数据,并且该数据结构中包含类型为 long 的变量,如果不了解 32 位进程将该变量视为 4 字节值,而 64 位进程将该变量视为 8 字节值,则在这两个进程之间交换的数据将无法正确解释。

处理此差异的一种方法是确保数据在这两个进程中具有完全相同的长度和含义。构建使用定宽类型(如 int32_tint64_t)的数据结构。处理对齐问题时仍需要小心。对于共享数据结构,可能需要对其进行填充,或者使用编译器指令(如 #pragma pack_Pack)对其重新打包。请参见对齐问题

<sys/types32.h> 中提供了用于镜像系统派生类型的派生类型系列。这些类型的符号和长度与 32 位系统的基本类型相同,但是按照特定方式进行定义,以便长度在 ILP32 和 LP64 编译环境中保持不变。

在 32 位和 64 位进程之间共享指针极为困难。显然,指针长度不同,但更重要的是,尽管在现有的 C 用法中有一个 64 位整数值 (long long),但是 64 位指针在 32 位环境中没有等效指针。为了使 64 位进程可以与 32 位进程共享数据,必须使 32 位进程一次最多只能查看 4 GB 共享数据。

XDR 例程 xdr_long(3NSL) 可能是一个问题,但是,在线上仍然会将其作为 32 位值进行处理,以便与现有协议兼容。如果要求该例程的 64 位版本对不适合 32 位值的 long 值进行编码,则编码操作将失败。