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


11

Während ich eine C-Quellcodedatei las, fand ich diese Deklarationen. (Dieser Quellcode wurde für das Linux-Systemprogramm geschrieben. Dies sind sehr wichtige Informationen.)

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

static timer_t* _interval_timer;
...

Zuerst wollte ich mehr über das 'timer_t' wissen. Also habe ich 'time.h' gegoogelt, um Header-Informationen zu erhalten. Aber es gab keine Worte über 'timer_t', sondern nur über 'time_t'.

Aus Neugier suchte und öffnete ich die Standardbibliotheksdatei 'time.h' auf meinem 'Mac'-Computer (wie Sie wissen, speichert der Ordner / usr / include c Standardbibliotheksdateien). Diese Datei war jedoch dieselbe wie die zuvor gegoogelte.

Schließlich schaltete ich mein Linux-Betriebssystem (Ubuntu) mit einer virtuellen Maschine ein und öffnete die 'time.h' im Linux C-Standardbibliotheksordner (der Ordnerpfad ist der gleiche wie bei OSX). Wie erwartet hat die Datei 'time.h' unter Linux die Deklaration timer_t.

Ich habe die folgenden Codezeilen hinzugefügt, die den Typ 'timer_t' deklarieren.

#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;

Meine Frage ist dies.

  1. Warum ist 'timer_t' nur in der Linux C-Standardbibliothek definiert?

  2. Kommt diese Situation häufig vor? Ich meine, gibt es unterschiedlich definierte Funktionen oder Attribute zwischen verschiedenen Betriebssystemen?


Der Typ timer_tist nicht "nur unter Linux definiert", zB auch unter Windows / Cygwin. Gemäß den Definitionen in den Header-Dateien (Linux und Cygwin) scheint es sich um einen POSIX-Standardtyp zu handeln. (Darüber hinaus entsprechen einige Plattformen möglicherweise nicht den Standards. Ich sehe keine spezifische Situation, die "häufig vorkommt", wie Sie sie formuliert haben.) Schreiben Sie Ihre allgemeine Frage zu Unterschieden in Sprachbibliotheken. Dies hängt davon ab, ob Anbieter Standards einhalten oder welche Versionen sie einhalten.
Janis


@ MarkPlotnick: Das ist eine Antwort
Lightness Races in Orbit

@LightningRacisinObrit Ich bedauere, dass ich eine (teilweise) Antwort als Kommentar geschrieben habe. Ich habe es entfernt.
Mark Plotnick

Antworten:


11

Unix und C haben eine verflochtene Geschichte, da sie beide ungefähr zur gleichen Zeit bei Bell Labs in New Jersey entwickelt wurden und einer der Hauptzwecke von C darin bestand, Unix in einer architekturunabhängigen, portablen Sprache auf hohem Niveau zu implementieren. Bis 1983 gab es jedoch keine offizielle Standardisierung. POSIX , die "tragbare Betriebssystemschnittstelle", ist ein IEEE-Betriebssystemstandard aus der Zeit der "Unix Wars" . Es hat sich seitdem weiterentwickelt und ist heute der am weitesten verbreitete Standard dieser Art. OSX ist offiziell POSIX-konform und Linux inoffiziell - es gibt Logistik und Kosten im Zusammenhang mit der offiziellen Konformität, an denen Linux-Distributionen nicht teilnehmen.

Vieles, 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 weder den timer_tTyp noch Funktionen, die es verwenden. Diese stammen aus der POSIX-Erweiterung , daher dieser Verweis im Linux-Header:

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

Das __USE_POSIX199309ist ein interner glibc Symbol , das in features.h gesetzt ist , wenn _POSIX_C_SOURCE >= 199309L, was bedeutet , dass POSIX.1b ist (siehe die unterstützt werden feature_test_macros -Manpage). Dies wird auch mit unterstützt _XOPEN_SOURCE >= 600.

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-Gegenstücken haben. Möglicherweise geschieht dies, wenn POSIX die Erweiterung aufnimmt, sie jedoch ändert, oder es handelt sich lediglich um Alternativen, die von GNU entwickelt wurden. Sie können sich für die eine oder andere entscheiden, indem Sie eine geeignete verwenden #define.


Sehr schön! Was für eine nette Erklärung!
Casamia

1
Bei den POSIX- und C-Standards ging es teilweise darum, C von Unix zu trennen - die beiden waren so eng miteinander verbunden, dass manchmal nicht klar war, was wohin ging.
teppic

2

timer_twird von den timer_-APIs in POSIX verwendet, z timer_create(). In der UNIX 03-Version von POSIX sind diese ein optionaler Teil von POSIX, und macOS hat sie nicht implementiert. Linux und Solaris und möglicherweise einige andere UN * Xes haben dies getan.

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, daher muss Apple dies tun, wenn sie Version 4 und nicht Version 3 der Spezifikation entsprechen möchten.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.