dlaczego w systemie Linux zdefiniowano „timer_t” w „time.h”, ale nie OS X


11

Podczas czytania plików kodu źródłowego C znalazłem te deklaracje. (Ten kod źródłowy został napisany dla programu systemu Linux. To bardzo ważna informacja)

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

static timer_t* _interval_timer;
...

Na początku chciałem dowiedzieć się więcej o „timer_t”. Więc przejrzałem „time.h”, aby uzyskać informacje w nagłówku. Ale nie było żadnych słów o „time_t”, tylko o „time_t”.

Z ciekawości przeszukałem i otworzyłem standardowy plik biblioteki „time.h” c na moim komputerze „mac” (jak wiecie, folder / usr / include przechowuje standardowe pliki biblioteki.) Ale ten plik był taki sam jak poprzedni googled.

W końcu włączyłem mój system Linux (ubuntu) za pomocą maszyny wirtualnej i uruchomiłem plik „time.h” w standardowym folderze biblioteki linux c (ścieżka folderu jest taka sama jak OSX). Tak jak się spodziewałem, plik „time.h” w systemie Linux ma deklarację timera_t.

Dodałem poniżej linie kodu, które deklarują typ „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;

Moje pytanie brzmi:

  1. Dlaczego „timer_t” jest zdefiniowany tylko w standardowej bibliotece linux c?

  2. Czy taka sytuacja często się zdarza? Mam na myśli, czy istnieją różne funkcje lub atrybuty w różnych systemach operacyjnych?


Typ timer_tnie jest „tylko zdefiniowany w systemie Linux”, np. W Windows / Cygwin jest również zdefiniowany. Zgodnie z definicjami w plikach nagłówkowych (Linux i Cygwin) wydaje się, że jest to standardowy typ POSIX. (Poza tym niektóre platformy mogą nie spełniać standardów, nie widzę żadnej konkretnej sytuacji, która „często się zdarza”, tak jak ją sformułowałeś.) WRT twoje ogólne pytanie na temat różnic w bibliotekach językowych; zależy to od tego, czy dostawcy przestrzegają standardów lub jakie wersje są zgodne.
Janis,


@MarkPlotnick: To odpowiedź
Lekkość

@LightningRacisinObrit Żałuję, że napisałem (częściową) odpowiedź jako komentarz. Usunąłem to.
Mark Plotnick

Odpowiedzi:


11

Unix i C mają ze sobą splecioną historię, ponieważ obie zostały opracowane mniej więcej w tym samym czasie w Bell Labs w New Jersey, a jednym z głównych celów C było wdrożenie Unixa przy użyciu przenośnego języka wysokiego poziomu, niezależnego od architektury. Jednak nie było żadnej oficjalnej standaryzacji do 1983 roku. POSIX , „interfejs przenośnego systemu operacyjnego” jest standardem systemu operacyjnego IEEE z czasów „Wojen Unixowych” . Od tego czasu ewoluuje i jest obecnie najczęściej wdrażanym takim standardem. OSX jest oficjalnie zgodny z POSIX, a Linux nieoficjalnie - logistyka i koszty związane z oficjalną zgodnością nie biorą udziału w dystrybucji Linux.

Wiele z tego, na czym skupił się POSIX, to opracowanie rzeczy, które nie są częścią ISO C. Czas. H, ale wersja ISO nie zawiera timer_ttypu ani żadnych funkcji, które z niego korzystają. Pochodzą one z rozszerzenia POSIX , stąd odniesienie w nagłówku linux:

#if !defined __timer_t_defined && \
((defined _TIME_H && defined __USE_POSIX199309)

__USE_POSIX199309Jest wewnętrzną symbol glibc, który jest ustawiony w features.h kiedy _POSIX_C_SOURCE >= 199309L, co oznacza, że POSIX.1b ma być obsługiwane (patrz feature_test_macros manpage). Jest to również obsługiwane przez _XOPEN_SOURCE >= 600.

czy są różne funkcje lub atrybuty w różnych systemach operacyjnych?

Myślę, że w odniesieniu do C, wśród systemów POSIX, staramy się tego uniknąć, ale tak się dzieje. Istnieje kilka rozszerzeń GNU (np. sterror_r()), Które mają niekompatybilne podpisy ze swoich odpowiedników POSIX. Być może dzieje się tak, gdy POSIX przejmuje rozszerzenie, ale je modyfikuje, albo są to po prostu alternatywy wymyślone przez GNU - możesz wybrać jedno lub drugie, używając odpowiedniego #define.


Bardzo dobrze! Cóż za miłe wytłumaczenie!
casamia

1
Standardy POSIX i C polegały częściowo na oddzieleniu C od Uniksa - oba były tak ściśle ze sobą powiązane, że czasami nie było jasne, co poszło.
teppic

2

timer_tjest używany przez interfejsy API timer_ w POSIX, takie jak timer_create(). W wersji POSIX UNIX 03 są one opcjonalną częścią POSIX, a macOS go nie implementował. Linux i Solaris, a być może niektóre inne UN * Xes.

Tak więc kod, który oglądałeś, może działać w systemach Linux i Solaris, ale nie będzie działał w systemie macOS, chyba że Apple zaimplementuje interfejsy API timera w przyszłości. (Są one częścią bieżącej wersji specyfikacji POSIX, więc Apple będzie musiało to zrobić, jeśli będzie chciało być zgodne z wersją 4, a nie wersją 3 specyfikacji).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.