Unix et C ont une histoire étroitement liée, car ils ont tous deux été développés à peu près au même moment aux Bell Labs dans le New Jersey et l'un des principaux objectifs de C était d'implémenter Unix en utilisant un langage portable de haut niveau, indépendant de l'architecture. Cependant, il n'y a pas eu de normalisation officielle avant 1983. POSIX, "l'interface du système d'exploitation portable" est une norme de système d'exploitation IEEE datant de l'époque des "guerres Unix". Elle n'a cessé d'évoluer depuis et est aujourd'hui la norme de ce type la plus largement mise en œuvre. OSX est officiellement conforme à POSIX, et linux l'est officieusement - il y a une logistique et des coûts associés à la conformité officielle auxquels les distributions Linux ne participent pas.
Une grande partie de ce sur quoi POSIX s'est concentré est l'élaboration de choses qui ne font pas partie de l'ISO C. Time.h l'est, mais la version ISO n'inclut pas le timer_t
type ou toutes les fonctions qui l'utilisent. Ceux-ci proviennent de l'extension POSIX, d'où cette référence dans l'en-tête linux :
#if !defined __timer_t_defined && \
((defined _TIME_H && defined __USE_POSIX199309)
Le __USE_POSIX199309
est un symbole glibc interne défini dans features.h lorsque _POSIX_C_SOURCE >= 199309L
, ce qui signifie que POSIX.1b doit être pris en charge (voir la page de manuel feature_test_macros). Ceci est également pris en charge avec _XOPEN_SOURCE >= 600
.
existe-t-il des fonctions ou des attributs définis différemment entre différents systèmes d'exploitation ?
Je pense qu'en ce qui concerne C, parmi les systèmes POSIX, il y a un effort pour éviter cela, mais cela arrive. Il existe quelques extensions GNU (par exemple sterror_r()
) qui ont des signatures incompatibles de leurs homologues POSIX. Cela se produit peut-être lorsque POSIX reprend l'extension mais la modifie, ou bien ce ne sont que des alternatives imaginées par GNU -- vous pouvez opter pour l'une ou l'autre en utilisant un #define
approprié .
timer_t
est utilisé par les API timer_ dans POSIX, telles que timer_create()
. Dans la version UNIX 03 de POSIX, il s'agit d'une partie facultative de POSIX, et macOS ne l'a pas implémentée. Linux et Solaris, et peut-être d'autres UN*X, l'ont fait.
Ainsi, le code que vous examiniez pourrait fonctionner sur Linux et Solaris, mais ne fonctionnera pas sur macOS, à moins qu'Apple n'implémente les API de minuterie à l'avenir. (Ils font partie de la version actuelle de la spécification POSIX, donc Apple devra le faire s'ils veulent se conformer à la version 4, plutôt qu'à la version 3, de la spécification.)