почему «timer_t» определяется в «time.h» в Linux, а не в OS X

11

Пока я читал файлы с исходным кодом на C, я обнаружил эти объявления. (Этот исходный код был написан для системной программы Linux. Это очень важная информация)

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

static timer_t* _interval_timer;
...

Сначала я хотел узнать больше о 'timer_t'. Так что я погуглил time.h, чтобы получить информацию заголовка. Но не было никаких слов о 'timer_t', только упоминание о 'time_t'.

Из любопытства я искал и открыл файл стандартной библиотеки time.h на моем компьютере mac (как вы знаете, в папке / usr / include хранятся файлы стандартной библиотеки.) Но этот файл был таким же, как и в предыдущем файле с поиском в Google.

Наконец, я включил свой linux os (ubuntu) с помощью виртуальной машины и открыл файл «time.h» в папке стандартной библиотеки linux c (путь к папке такой же, как в OSX). Как я и ожидал, файл 'time.h' в linux имеет объявление 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. Такая ситуация обычно происходит? Я имею в виду, есть ли по-разному определенные функции или атрибуты между различными ОС?

Casamia
источник
Тип timer_tне «определен только в Linux», например, в Windows / Cygwin он также определен. Согласно определениям в заголовочных файлах (Linux и Cygwin), это, кажется, стандартный тип POSIX. (Кроме того, некоторые платформы могут не соответствовать стандартам. Я не вижу какой-либо конкретной ситуации, которая «обычно случается», как вы ее сформулировали.) WRT ваш общий вопрос о различиях в языковых библиотеках; это зависит от того, соответствуют ли поставщики стандартам или каким версиям они соответствуют.
Янис
Вот ссылка из POSIX: pubs.opengroup.org/onlinepubs/009695399/functions/…
teppic
@MarkPlotnick: Это ответ
гонки на
@LightningRacisinObrit Я сожалею, что написал (частичный) ответ в качестве комментария. Я удалил это.
Марк Плотник

Ответы:

11

Unix и C имеют переплетенную историю, поскольку они оба были разработаны примерно в одно и то же время в Bell Labs в Нью-Джерси, и одной из основных целей C было внедрение Unix с использованием высокоуровневого, независимого от архитектуры, переносимого языка. Однако официальной стандартизации до 1983 года не было. POSIX , «интерфейс переносимой операционной системы», является стандартом операционной системы IEEE, существовавшим во времена «войн 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 должен поддерживаться (см. Справочную страницу feature_test_macros ). Это также поддерживается с _XOPEN_SOURCE >= 600.

Есть ли по-разному определенные функции или атрибуты между различными ОС?

Я думаю, что в отношении C, среди систем POSIX, есть попытки избежать этого, но это происходит. Есть некоторые расширения GNU (например sterror_r()), которые имеют несовместимые подписи от своих аналогов POSIX. Возможно, это происходит, когда POSIX принимает расширение, но изменяет его, или же это просто альтернатива, придуманная GNU - вы можете выбрать одно или другое с помощью соответствующего #define.

лютик золотистый
источник
Очень хорошо! Какое доброе объяснение!
Casamia
1
Стандарты POSIX и C частично касались отделения C от Unix - эти два были настолько тесно связаны, что иногда было неясно, что и куда делось.
Teppic
2

timer_tиспользуется API-интерфейсом timer_ в POSIX, например timer_create(). В версии POSIX для UNIX 03 они являются необязательной частью POSIX, и macOS не реализовала это. Linux и Solaris и, возможно, некоторые другие UN * Xes сделали.

Таким образом, код, который вы просматривали, может работать на Linux и Solaris, но не будет работать на macOS, если Apple не внедрит API таймера в будущем. (Они являются частью текущей версии спецификации POSIX, поэтому Apple должна будет сделать это, если они хотят соответствовать версии 4, а не версии 3 спецификации.)

user392227
источник