Пока я читал файлы с исходным кодом на 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;
У меня вопрос такой.
Почему 'timer_t' определяется только в стандартной библиотеке Linux C?
Такая ситуация обычно происходит? Я имею в виду, есть ли по-разному определенные функции или атрибуты между различными ОС?
timer_t
не «определен только в Linux», например, в Windows / Cygwin он также определен. Согласно определениям в заголовочных файлах (Linux и Cygwin), это, кажется, стандартный тип POSIX. (Кроме того, некоторые платформы могут не соответствовать стандартам. Я не вижу какой-либо конкретной ситуации, которая «обычно случается», как вы ее сформулировали.) WRT ваш общий вопрос о различиях в языковых библиотеках; это зависит от того, соответствуют ли поставщики стандартам или каким версиям они соответствуют.Ответы:
Unix и C имеют переплетенную историю, поскольку они оба были разработаны примерно в одно и то же время в Bell Labs в Нью-Джерси, и одной из основных целей C было внедрение Unix с использованием высокоуровневого, независимого от архитектуры, переносимого языка. Однако официальной стандартизации до 1983 года не было. POSIX , «интерфейс переносимой операционной системы», является стандартом операционной системы IEEE, существовавшим во времена «войн Unix» . С тех пор он развивается и в настоящее время является наиболее широко применяемым таким стандартом. Официально OSX совместима с POSIX, а неофициально - linux - есть официальная логистика и затраты, связанные с официальным соответствием, в которые не входят дистрибутивы linux.
Многое из того, на чем сфокусировался POSIX, - это разработка вещей, не являющихся частью ISO C. Time.h есть, но версия ISO не включает
timer_t
тип или любые функции, которые его используют. Они из расширения POSIX , поэтому эта ссылка в заголовке linux:Это
__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
.источник
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 спецификации.)
источник