将 UNIX 应用程序移植到 Linux 操作系统非常容易。Linux 及其使用的 GNU C 库在设计时就考虑到了应用程序的可移植性,这意味着许多应用程序只需发出以下命令即可编译make。而那些无法编译的应用程序通常使用特定实现的某些晦涩功能,或者严重依赖于未记录或未定义的行为,例如,特定的系统调用。
Linux 在很大程度上符合 IEEE Std 1003.1-1988 (POSIX.1) 标准,但实际上并未获得相关认证。同样,Linux 也实现了 UNIX 的 SVID 和 BSD 分支中的许多功能,但同样并不一定在所有情况下都遵循这些标准。总的来说,Linux 的设计目标是与其他 UNIX 实现兼容,以使应用程序移植更容易,并且在许多情况下改进或纠正了这些实现中发现的行为。
例如,传递给 select 系统调用的 timeout 参数实际上会在 Linux 的轮询操作期间被递减。其他实现根本不修改此值,而未预料到这一点的应用程序在 Linux 下编译时可能会崩溃。BSD 和 SunOS 的 select 手册页警告说,在“未来的实现”中,系统调用可能会修改 timeout 指针。不幸的是,许多应用程序仍然假设该值不会被修改。
本文的目标是概述与将应用程序移植到 Linux 相关的主要问题,重点介绍 Linux、POSIX.1、SVID 和 BSD 在以下领域之间的差异:信号处理、终端 I/O、进程控制和信息收集以及可移植的条件编译。