Unix e C hanno una storia intrecciata, poiché sono stati entrambi sviluppati nello stesso periodo presso i Bell Labs nel New Jersey e uno degli scopi principali di C era implementare Unix utilizzando un linguaggio portatile di alto livello, indipendente dall'architettura. Tuttavia, non ci fu alcuna standardizzazione ufficiale fino al 1983. POSIX, l'"interfaccia del sistema operativo portatile" è uno standard del sistema operativo IEEE che risale al tempo delle "Guerre Unix". Da allora si è evoluto ed è ora lo standard di questo tipo più ampiamente implementato. OSX è ufficialmente conforme a POSIX e Linux ufficiosamente lo è:ci sono logistiche e costi associati alla conformità ufficiale a cui le distribuzioni 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 sì, ma la versione ISO non include timer_t
type o qualsiasi funzione che lo utilizza. Quelli provengono dall'estensione POSIX, quindi questo riferimento nell'intestazione linux:
#if !defined __timer_t_defined && \
((defined _TIME_H && defined __USE_POSIX199309)
Il __USE_POSIX199309
è un simbolo interno di glibc impostato in features.h quando _POSIX_C_SOURCE >= 199309L
, il che significa che POSIX.1b deve essere supportato (vedere la manpage feature_test_macros). Questo è supportato anche con _XOPEN_SOURCE >= 600
.
ci sono funzioni o attributi definiti in modo diverso tra diversi sistemi operativi?
Penso che per quanto riguarda C, tra i sistemi POSIX, ci sia uno sforzo per evitarlo, ma succede. Esistono alcune estensioni GNU (ad esempio sterror_r()
) che hanno firme incompatibili dalle loro controparti POSIX. Forse questo accade quando POSIX riprende l'estensione ma la modifica, oppure sono solo alternative inventate da GNU -- puoi optare per l'una o per l'altra usando un appropriato #define
.
timer_t
è usato dalle API timer_ in POSIX, come timer_create()
. Nella versione UNIX 03 di POSIX, queste sono una parte facoltativa di POSIX e macOS non l'ha implementata. Linux e Solaris, e forse qualche altro UN*X, lo hanno fatto.
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 del timer in futuro. (Fanno parte della versione corrente della specifica POSIX, quindi Apple dovrà farlo se vuole conformarsi alla versione 4, piuttosto che alla versione 3, della specifica.)