perché "timer_t" è definito in "time.h" su Linux ma non su OS X.


11

Mentre stavo leggendo un file di codice sorgente C, ho trovato queste dichiarazioni. (Questo codice sorgente è stato scritto per il programma di sistema linux. Questa è un'informazione molto importante)

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

static timer_t* _interval_timer;
...

All'inizio, volevo sapere di più su "timer_t". Quindi ho cercato su google "time.h" per ottenere informazioni sull'intestazione. Ma non c'erano parole su "timer_t", ma solo su "time_t".

Per curiosità, ho cercato e aperto il file di libreria standard 'time.h' c nel mio computer 'mac' (come sapete, / usr / include archivi di cartelle c file di libreria standard.) Ma questo file era lo stesso del precedente su Google.

Alla fine, ho acceso il mio sistema operativo Linux (Ubuntu) usando la macchina virtuale e ho aperto 'time.h' nella cartella della libreria standard di linux c (il percorso della cartella è lo stesso di OSX). Come mi aspettavo, il file 'time.h' in Linux ha la dichiarazione di timer_t.

Ho aggiunto le righe di codice che dichiarano il tipo 'timer_t' di seguito.

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

La mia domanda è questa

  1. Perché 'timer_t' è definito solo nella libreria standard di linux c?

  2. Questa situazione si verifica comunemente? Voglio dire, ci sono funzioni o attributi definiti in modo diverso tra diversi sistemi operativi?


Il tipo timer_tnon è "definito solo in Linux", ad esempio su Windows / Cygwin è anche definito. Secondo le definizioni nei file di intestazione (Linux e Cygwin) sembra essere un tipo standard POSIX. (A parte il fatto che alcune piattaforme potrebbero non essere conformi agli standard, non vedo alcuna situazione specifica che "accade comunemente", come è stata formulata.) SCRIVI la tua domanda generale sulle differenze nelle librerie di lingue; dipende dal fatto che i fornitori rispettino gli standard o con quali versioni rispettino.
Janis,


@MarkPlotnick: Questa è una risposta
gare di leggerezza in orbita

@LightningRacisinObrit Mi dispiace di aver scritto una risposta (parziale) come commento. L'ho rimosso.
Mark Plotnick,

Risposte:


11

Unix e C hanno una storia intrecciata, poiché entrambi sono stati sviluppati nello stesso periodo ai Bell Labs nel New Jersey e uno degli scopi principali di C era implementare Unix usando un linguaggio portatile di alto livello, indipendente dall'architettura. Tuttavia, non vi fu alcuna standardizzazione ufficiale fino al 1983. POSIX , l '"interfaccia del sistema operativo portatile" è uno standard del sistema operativo IEEE che risale al tempo di "Unix Wars" . Da allora si è evoluto ed è ora lo standard più ampiamente implementato. OSX è ufficialmente conforme a POSIX e Linux in modo non ufficiale - ci sono logistica e costi associati alla conformità ufficiale a cui le distribuzioni di Linux non partecipano.

Gran parte di ciò su cui POSIX si è concentrato è l'elaborazione di cose che non fanno parte di ISO C. Time.h è, ma la versione ISO non include il timer_ttipo o le funzioni che lo utilizzano. Quelli provengono dall'estensione POSIX , quindi questo riferimento nell'intestazione di Linux:

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

Il __USE_POSIX199309è un simbolo glibc interno che viene impostato in features.h quando _POSIX_C_SOURCE >= 199309L, nel senso che POSIX.1b deve essere supportate (vedere la feature_test_macros manpage). Questo è supportato anche con _XOPEN_SOURCE >= 600.

ci sono funzioni o attributi definiti in modo diverso tra diversi sistemi operativi?

Per quanto riguarda C, penso che tra i sistemi POSIX ci sia uno sforzo per evitarlo, ma succede. Ci sono alcune estensioni GNU (ad esempio sterror_r()) che hanno firme incompatibili dalle loro controparti POSIX. Forse questo accade quando POSIX prende l'estensione ma la modifica, oppure sono solo alternative immaginate da GNU: puoi optare per l'una o l'altra usando un'opportuna #define.


Molto bella! Che gentile spiegazione!
Casamia,

1
Gli standard POSIX e C riguardavano in parte la separazione di C da Unix: i due erano così strettamente legati che a volte non era chiaro cosa fosse successo.
teppic

2

timer_tviene utilizzato dalle API timer_ in POSIX, ad esempio timer_create(). Nella versione UNIX 03 di POSIX, queste sono una parte opzionale di POSIX e macOS non l'ha implementata. Linux e Solaris, e forse qualche altro UN * Xes, lo fecero.

Quindi il codice che stavi guardando potrebbe funzionare su Linux e Solaris, ma non funzionerà su macOS, a meno che Apple non implementi le API timer in futuro. (Fanno parte della versione corrente della specifica POSIX, quindi Apple dovrà farlo se vogliono conformarsi alla versione 4, piuttosto che alla versione 3, della specifica.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.