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.)