为什么 Linux 上的“time.h”中定义了“timer_t”,而 OS X 上则不然

为什么 Linux 上的“time.h”中定义了“timer_t”,而 OS X 上则不然

当我阅读 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;

我的问题是这样的。

  1. 为什么'timer_t'只在Linux C标准库中定义?

  2. 这种情况常见吗?我的意思是,不同操作系统之间是否有不同定义的功能或属性?

答案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,则必须这样做。)

相关内容