为多个 UNIX 平台编写软件
2008-11-13 08:29:12 来源:WEB开发网获得了缺少符号的列表后,可以查找目标平台上的手册页,并标识所需的库。
对于完全缺少的函数,可能需要自己构建这些函数,或从第三方库提供。例如,GNU glibc 包含很多您可能依赖的本机 UNIX C 库中不提供的函数。
自己构建函数时,可以创建包含不同平台的函数定义的单个 C 源文件,然后使用前面显示的直接方法来选择是否在不同平台上构建相应的函数。
字节顺序差异
除了头文件和库的基本知识之外,下面将开始了解非常特定于平台的差异,而此类差异通常更难于解决。
这些差异中的最基本的就是主机 CPU 的字节顺序。字节顺序会影响如何引用和访问多字节数据的方式。这是由于 CPU 操作方式造成的。
Big Endian CPU(包括 SPARC、PA-RISC 和 PowerPC)采用首先引用最高有效位的方式引用信息,而 Little Endian CPU(主要是 Intel)则采用首先引用最低有效位的方式引用信息。这样可能会导致将地址完全反向,如会从 ABCD 反向为 DCBA。
这并不会影响字符串,因为字符串基于单个字节,但这会影响多字节值(如 32 位地址),因为其中的字节顺序会导致在 Big endian CPU 和 Little endian CPU 上以不同的方式对待值。
此问题并不能简单地得到解决,但可以采用很多方法来引用和存储信息,而不依赖对多字节数据的直接访问,从而避免此问题。
处理、发送信号及 IPC
不同 UNIX 变体内的不同 fork() 和线程实现之间存在较小的差异。例如,并非所有 UNIX 变体都支持所有 fork*() 函数。IRIX 支持 m_fork() 函数,该函数实际上与各个线程库中的一个类似。不过,即使在线程领域内,不同的实现和标准并未得到广泛的推广。
不同 UNIX 变体支持一系列不同的信号。很多核心信号都保持了一致性;例如,SIGHUP 的值为 1,SIGKILL 的值为 NINE,但并不依赖于在所有平台上提供特定于 OS 的信号的可用性,如 SIGJVM1(特定于 Solaris)。通常只有 15 以下的信号才在大多数平台上完全相同。超过 15 (SIGTERM) 的信号完全特定于 OS。
更多精彩
赞助商链接