чому "Linux.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' c в моєму комп'ютері «mac» (як ви знаєте, / usr / include folder store c стандартні файли бібліотеки.) Але цей файл був однаковим із попереднім googled.

Нарешті, я включив свій linux os (ubuntu) за допомогою віртуальної машини та відкрив 'time.h' у стандартній папці бібліотеки linux c (шлях до папки такий же, як у OSX). Як я і очікував, файл 'time.h' в Linux має декларацію timeer_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. (Крім того, що деякі платформи можуть не відповідати стандартам, я не бачу конкретної ситуації, яка "зазвичай трапляється", як ви це сформулювали.) Напишіть своє загальне питання про відмінності в мовних бібліотеках; це залежить від того, чи відповідають постачальникам стандарти, або яким версіям вони відповідають.
Яніс

Ось посилання з POSIX: pubs.opengroup.org/onlinepubs/009695399/functions/…
teppic

@MarkPlotnick: Ось відповідь
гонки легкості в орбіті

@LightningRacisinObrit Я шкодую, що написав (часткову) відповідь як коментар. Я її зняв.
Марк Плотнік

Відповіді:


11

У Unix і C є переплетена історія, оскільки вони були розроблені приблизно в один і той же час в Bell Labs в Нью-Джерсі, і однією з головних цілей 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Є внутрішнім символом 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 - вони були настільки тісно пов'язані, що часом не було зрозуміло, що куди піти.
теппік

2

timer_tвикористовується API-файлами timer_ в POSIX, таких як timer_create(). У версії UNIX 03 POSIX вони є необов'язковою частиною POSIX, і macOS не реалізував її. Linux і Solaris, і можливо, деякі інші UN * Xes, це зробили.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.