GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum ist timer_t in time.h unter Linux definiert, aber nicht unter OS X

Unix und C haben eine miteinander verflochtene Geschichte, da sie beide etwa zur gleichen Zeit in den Bell Labs in New Jersey entwickelt wurden und einer der Hauptzwecke von C darin bestand, Unix mit einer hochrangigen, architekturunabhängigen, portablen Sprache zu implementieren. Eine offizielle Standardisierung gab es jedoch bis 1983 nicht. POSIX, das "Portable Operating System Interface", ist ein IEEE-Betriebssystemstandard aus der Zeit der "Unix Wars". Seitdem hat er sich weiterentwickelt und ist heute der am weitesten verbreitete Standard dieser Art. OSX ist offiziell POSIX-kompatibel und Linux ist es inoffiziell – es gibt Logistik und Kosten im Zusammenhang mit der offiziellen Konformität, an denen Linux-Distributionen nicht beteiligt sind.

Vieles von dem, worauf sich POSIX konzentriert hat, ist die Ausarbeitung von Dingen, die nicht Teil von ISO C sind. Time.h ist es, aber die ISO-Version enthält nicht den timer_t Typ oder alle Funktionen, die ihn verwenden. Diese stammen von der POSIX-Erweiterung, daher dieser Verweis im Linux-Header:

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

Die __USE_POSIX199309 ist ein internes glibc-Symbol, das in features.h gesetzt wird, wenn _POSIX_C_SOURCE >= 199309L , was bedeutet, dass POSIX.1b unterstützt werden soll (siehe manpage feature_test_macros). Dies wird auch mit _XOPEN_SOURCE >= 600 unterstützt .

Gibt es unterschiedlich definierte Funktionen oder Attribute zwischen verschiedenen Betriebssystemen?

Ich denke, in Bezug auf C gibt es unter POSIX-Systemen Bemühungen, dies zu vermeiden, aber es passiert. Es gibt einige GNU-Erweiterungen (z. B. sterror_r() ), die inkompatible Signaturen von ihren POSIX-Pendants haben. Möglicherweise passiert dies, wenn POSIX die Erweiterung aufnimmt, sie aber modifiziert, oder es handelt sich nur um von GNU erdachte Alternativen - Sie können sich für das eine oder andere entscheiden, indem Sie einen entsprechenden #define verwenden .


timer_t wird von den timer_ APIs in POSIX verwendet, wie z. B. timer_create() . In der UNIX 03-Version von POSIX sind diese ein optionaler Teil von POSIX, und macOS hat ihn nicht implementiert. Linux und Solaris und möglicherweise einige andere UN*X-Versionen taten dies.

Der Code, den Sie sich angesehen haben, funktioniert möglicherweise unter Linux und Solaris, aber nicht unter macOS, es sei denn, Apple implementiert die Timer-APIs in Zukunft. (Sie sind Teil der aktuellen Version der POSIX-Spezifikation, also muss Apple dies tun, wenn sie sich an Version 4 statt an Version 3 der Spezifikation halten wollen.)


Linux
  1. Linux – Kali Linux ist installiert, wird aber nicht im Boot-Manager angezeigt?

  2. Linux – Warum gibt es eine Linux-Kernel-Richtlinie, um den Benutzerbereich niemals zu unterbrechen?

  3. Warum sehe ich MSG_EOR für SOCK_SEQPACKET unter Linux nicht?

  4. Linux wie kopieren, aber nicht überschreiben?

  5. Gibt es eine UNIX-zertifizierte Linux-Distribution?

Linux-Zeitbefehl

Was ist POSIX? Warum ist es für Linux/UNIX-Benutzer wichtig?

Linux Mint 20 Ulyana Xfce - Nicht ganz da

Warum gibt es keine DirectX-API für Linux?

Warum haben Linux/POSIX lchown, aber nicht lchmod?

Warum kann Wine 64-Bit-Programme unter Linux ausführen, aber nicht auf Mac?