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

cas*_*mia 13 linux c darwin

当我阅读 C 源代码文件时,我发现了这个声明。(此源码是为linux系统程序编写的,这是很重要的信息)

#include <time.h>
#include <stdio.h>

static timer_t* _interval_timer;
...
Run Code Online (Sandbox Code Playgroud)

起初,我想更多地了解“timer_t”。所以我用谷歌搜索“time.h”来获取标题信息。但是,没有任何关于'timer_t'的词,只提到了'time_t'。

出于好奇,我在我的 'mac' 计算机中搜索并打开了 'time.h' c 标准库文件(如您所知,/usr/include 文件夹存储 c 标准库文件。)但该文件与之前在 google 上搜索到的文件相同。

最后,我使用虚拟机打开我的linux os(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;
Run Code Online (Sandbox Code Playgroud)

我的问题是这个。

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

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

gol*_*cks 13

Unix 和 C 有着交织的历史,因为它们大约在同一时间在新泽西州的贝尔实验室开发,C 的主要目的之一是使用高级、架构独立、可移植的语言来实现 Unix。然而,直到 1983 年才出现任何官方标准化 。POSIX,即“便携式操作系统接口”是一种可追溯到“Unix 大战”时期的 IEEE 操作系统标准。从那时起,它一直在发展,现在是最广泛实施的此类标准。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)
Run Code Online (Sandbox Code Playgroud)

__USE_POSIX199309是在features.h设定时的内部的glibc符号_POSIX_C_SOURCE >= 199309L,这意味着POSIX.1b是被支持(见feature_test_macros手册页)。这也支持_XOPEN_SOURCE >= 600.

不同操作系统之间是否有不同定义的功能或属性?

我认为关于 C,在 POSIX 系统中,有人努力避免这种情况,但它确实发生了。有一些 GNU 扩展(例如sterror_r())与 POSIX 对应的签名不兼容。当 POSIX 接受扩展但修改它时,可能会发生这种情况,否则它们只是 GNU 梦想的替代方案——您可以通过使用适当的#define.