![为什么 Linux 上的“time.h”中定义了“timer_t”,而 OS X 上则不然](https://linux22.com/image/62490/%E4%B8%BA%E4%BB%80%E4%B9%88%20Linux%20%E4%B8%8A%E7%9A%84%E2%80%9Ctime.h%E2%80%9D%E4%B8%AD%E5%AE%9A%E4%B9%89%E4%BA%86%E2%80%9Ctimer_t%E2%80%9D%EF%BC%8C%E8%80%8C%20OS%20X%20%E4%B8%8A%E5%88%99%E4%B8%8D%E7%84%B6.png)
当我阅读 C 源代码文件时,我发现了这个声明。 (此源代码是为linux系统程序编写的,这是非常重要的信息)
#include <time.h>
#include <stdio.h>
static timer_t* _interval_timer;
...
起初,我想更多地了解“timer_t”。所以我用谷歌搜索“time.h”来获取标题信息。但是,没有任何关于“timer_t”的文字,只提到“time_t”。
出于好奇,我在我的“mac”计算机中搜索并打开了“time.h”c 标准库文件(如您所知,/usr/include 文件夹存储了 c 标准库文件。)但是这个文件与之前 google 到的文件相同。
最后,我使用虚拟机打开我的linux操作系统(ubuntu)并打开linux c标准库文件夹中的'time.h'(文件夹路径与OSX相同)。正如我所料,linux中的'time.h'文件有timer_t的声明。
我添加了声明下面“timer_t”类型的代码行。
#if !defined __timer_t_defined && \
((defined _TIME_H && defined __USE_POSIX199309) || defined __need_timer_t)
# define __timer_t_defined 1
# include <bits/types.h>
/* Timer ID returned by `timer_create'. */
typedef __timer_t timer_t;
我的问题是这样的。
为什么'timer_t'只在Linux C标准库中定义?
这种情况常见吗?我的意思是,不同操作系统之间是否有不同定义的功能或属性?
答案1
Unix 和 C 有着交织在一起的历史,因为它们都是在新泽西州贝尔实验室大约同时开发的,而 C 的主要目的之一是使用高级的、独立于体系结构的、可移植的语言来实现 Unix。然而,直到 1983 年才出现任何官方标准化。 POSIX,“可移植操作系统接口”是 IEEE 操作系统标准,其历史可以追溯到 2007 年《Unix 战争》。从那时起它就一直在发展,现在已成为实施最广泛的此类标准。 OSX 是正式兼容 POSIX 的,而 Linux 是非官方兼容的——与官方合规性相关的物流和成本是 Linux 发行版不参与的。
POSIX 关注的大部分内容是对 ISO C 之外的内容的阐述。Time.h 是,但 ISO 版本不包括timer_t
使用它的类型或任何函数。那些来自POSIX 扩展,因此在 linux 头文件中有这样的引用:
#if !defined __timer_t_defined && \
((defined _TIME_H && defined __USE_POSIX199309)
是__USE_POSIX199309
一个内部 glibc 符号,在 features.h 中设置_POSIX_C_SOURCE >= 199309L
,表示支持 POSIX.1b(请参阅功能测试宏联机帮助页)。这也得到支持_XOPEN_SOURCE >= 600
。
不同操作系统之间是否有不同定义的功能或属性?
我认为对于 C,在 POSIX 系统中,人们正在努力避免这种情况,但它确实发生了。有一些 GNU 扩展(例如sterror_r()
)与 POSIX 对应部分具有不兼容的签名。当 POSIX 占用扩展但修改它时,可能会发生这种情况,或者它们只是 GNU 梦想的替代方案 - 您可以通过使用适当的#define
.
答案2
timer_t
由POSIX中的timer_ API使用,例如timer_create()
。在 POSIX 的 UNIX 03 版本中,这些是 POSIX 的可选部分,macOS 没有实现它。 Linux 和 Solaris,可能还有其他一些 UN*X,都是如此。
因此,您正在查看的代码可能适用于 Linux 和 Solaris,但不适用于 macOS,除非 Apple 将来实现计时器 API。 (它们是 POSIX 规范当前版本的一部分,因此如果 Apple 想要符合规范的版本 4 而不是版本 3,则必须这样做。)