pourquoi "timer_t" est-il défini dans "time.h" sous Linux mais pas sous OS X

Pendant que je lisais un file de code source C, j'ai trouvé ces déclarations. (Ce code source a été écrit pour le programme du système Linux.C'est une information très importante)

#include <time.h> #include <stdio.h> static timer_t* _interval_timer; ... 

Au début, je voulais en savoir plus sur le 'timer_t'. J'ai donc googlé 'time.h' pour get des informations d'en-tête. Mais, il n'y avait pas de mots sur «timer_t», ne mentionnant que «time_t».

Dans la curiosité, j'ai cherché et ouvert le file de bibliothèque standard time.h 'c dans mon ordinateur' mac '(comme vous le savez, / usr / include folder stocke les files de bibliothèque standard c.) Mais ce file était identique à celui de Googled.

Enfin, j'ai allumé mon os Linux (ubuntu) en utilisant la machine virtuelle et ouvrez le 'time.h' dans le dossier de la bibliothèque standard de linux c (le path du dossier est identique à OSX). Comme prévu, le file 'time.h' dans linux a la déclaration de timer_t.

J'ai ajouté les lignes de code qui déclarent le type 'timer_t' ci-dessous.

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

Ma question est la suivante.

  1. Pourquoi "timer_t" n'est défini que dans la bibliothèque standard de linux c?

  2. Cette situation arrive-t-elle souvent? Je veux dire, y a-t-il des fonctions ou des attributes définis différemment entre différents systèmes d'exploitation?

Unix et C ont une histoire entremêlée car ils ont tous deux été développés à la même époque aux Bell Labs du New Jersey et l'un des principaux objectives de C était de mettre en œuvre Unix en utilisant un langage portable de haut niveau indépendant de l'architecture. Cependant, il n'y a eu aucune normalisation officielle jusqu'en 1983. POSIX , l '«interface du operating system portable» est une norme de operating system IEEE datant de l'époque des «guerres Unix» . Il a évolué depuis et est maintenant la norme la plus largement appliquée. OSX est officiellement conforme à POSIX, et Linux est officieusement – il existe une logistique et des coûts associés à la conformité officielle auxquels les dissortingbutions linux ne participent pas.

Une grande partie de ce que POSIX a mis au point est l'élaboration de choses ne faisant pas partie de l'ISO C. Time.h, mais la version ISO n'inclut pas le type timer_t ou les fonctions qui l'utilisent. Ceux-ci proviennent de l'extension POSIX , d'où cette reference dans l'en-tête linux:

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

__USE_POSIX199309 est un symbole interne de glibc 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 supporté avec _XOPEN_SOURCE >= 600 .

existe-t-il des fonctions ou attributes définis différemment entre différents systèmes d'exploitation?

Je pense en ce qui concerne C, parmi les systèmes POSIX, il y a un effort pour éviter cela, mais cela arrive. Il y a quelques extensions GNU (par exemple sterror_r() ) qui ont des signatures incompatibles de leurs homologues POSIX. Peut-être cela arrive-t-il lorsque POSIX prend 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 une #define appropriée.