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


11

在阅读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标准库文件。)但是,该文件与以前用谷歌搜索的文件相同。

最后,我使用虚拟机打开了Linux os(ubuntu),并在linux c标准库文件夹(文件夹路径与OSX相同)中打开了“ time.h”。如我所料,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. 这种情况通常发生吗?我的意思是,不同的操作系统之间是否存在定义不同的功能或属性?


该类型timer_t不是“仅在linux中定义”,例如在Windows / Cygwin上也已定义。根据头文件(Linux和Cygwin)中的定义,它似乎是POSIX标准类型。(除了某些平台可能不符合标准外,在您制定时,我看不到任何“常见情况”的特殊情况。)WRT有关语言库差异的一般性问题;这取决于供应商是否遵守标准或他们遵循的版本。
Janis


@MarkPlotnick:这是一个答案
Lightness Races in Orbit

@LightningRacisinObrit我很遗憾写了一个(部分)答案作为评论。我已经删除了
马克·普洛特尼克

Answers:


11

Unix和C有着交织在一起的历史,因为它们都是在新泽西州的贝尔实验室同时开发的,而C的主要目的之一就是使用高级的,独立于体系结构的可移植语言来实现Unix。但是,直到1983年才有任何正式的标准化 。POSIX,“便携式操作系统接口”是IEEE操作系统标准,可以追溯到“ Unix Wars”时代。此后一直在发展,现在已成为实施最广泛的此类标准。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是在features.h设定时的内部的glibc符号_POSIX_C_SOURCE >= 199309L,这意味着POSIX.1b是被支持(见feature_test_macros手册页)。也支持_XOPEN_SOURCE >= 600

不同的操作系统之间是否存在任何不同定义的功能或属性?

我认为关于POSIX系统中的C,有一种努力来避免这种情况,但是确实发生了。有一些GNU扩展(例如sterror_r())具有与POSIX对应物不兼容的签名。可能是在POSIX占用了扩展名但对其进行了修改时发生的,或者它们只是GNU所梦想的替代方案-您可以使用适当的来选择其中一个#define


非常好!真是一种解释!
casamia 2015年

1
POSIX和C标准在某种程度上是关于将C与Unix分开的-两者是如此紧密地联系在一起,以至于有时不清楚到底是什么。
teppic 2015年

2

timer_t由POSIX中的timer_ API使用,例如timer_create()。在UNIX 03版本的POSIX中,这些是POSIX的可选部分,而macOS并未实现它。Linux和Solaris以及其他一些UN * Xes都可以做到。

因此,除非苹果将来实现计时器API,否则您正在查看的代码可能会在Linux和Solaris上运行,但无法在macOS上运行。(它们是POSIX规范当前版本的一部分,因此,如果苹果想要符合规范的版本4,而不是版本3,则必须这样做。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.