本节书摘来自异步社区《UNIX环境高级编程(第3版)》一书中的第2章,第2.9节,作者:【美】W. Richard Stevens , Stephen A.Rago著,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.9 标准之间的冲突
就整体而言,这些不同的标准之间配合得相当好。因为SUS基本说明和POSIX.1是同一个东西,所以我们不对它们进行特别的说明,我们主要关注ISO C标准和POSIX.1之间的差别。它们之间的冲突并非有意,但如果出现冲突,POSIX.1服从ISO C标准。然而它们之间还是存在着一些差别的。
ISO C定义了clock函数,它返回进程使用的CPU时间,返回值是clock_t类型值,但ISO C标准没有规定它的单位。为了将此值变换成以秒为单位,需要将其除以在头文件中定义的CLOCKS_PER_SEC。POSIX.1定义了times函数,它返回其调用者及其所有终止子进程的CPU时间以及时钟时间,所有这些值都是clock_t类型值。sysconf函数用来获得每秒滴答数,用于表示times函数的返回值。ISO C和POSIX.1用同一种数据类型(clock_t)来保存对时间的测量,但定义了不同的单位。这种差别可以在Solaris中看到,其中clock返回微秒数(CLOCK_PER_SEC是100万),而sysconf为每秒滴答数返回的值是100。因此,我们在使用clock_t类型变量的时候,必须十分小心以免混淆不同的时间单位。
另一个可能产生冲突的地方是:在ISO C标准说明函数时,可能没有像POSIX.1那样严。在POSIX环境下,有些函数可能要求有一个与C环境下不同的实现,因为POSIX环境中有多个进程,而ISO C环境则很少考虑宿主操作系统。尽管如此,很多符合POSIX的系统为了兼容性也会实现ISO C函数。signal函数就是一个例子。如果在不了解的情况下使用了Solaris提供的signal函数(希望编写可在ISO C环境和较早UNIX系统中运行的可兼容程序),那么它提供了与POSIX.1 sigaction函数不同的语义。第10章将对signal函数做更多说明。