2010-06-01 2 views
7

sous le répertoire/usr/include sous Linux je suis entré dans la commande: trouver -type f -name unistd.h qui a donné le résultat suivant:Quelle est la différence entre les différents unistd.h sous/usr/include sous Linux?

./unistd.h ./linux/unistd.h ./asm-generic/unistd.h ./bits/unistd.h ./asm/unistd.h ./sys/unistd.h

ma question est, quel est le but de chaque unistd.h , puisqu'il n'y a qu'une seule définition de ce fichier dans la spécification unix unique?

Merci d'avance.

Répondre

7

linux/unistd.h points de fait à asm/unistd.h, qui indique à son tour soit asm/unistd_32.h ou asm/unistd_64.h, qui est l'endroit où les numéros d'appel du système sont définis et présentés à l'espace utilisateur en fonction de l'architecture du système. Ceux-ci viennent du noyau.

bits/unistd.h est une collection de macros qui augmentent unistd.h (la plupart du temps des choses pour aider à prévenir les débordements de tampon), qui est conditionnellement inclus via:

/* Define some macros helping to catch buffer overflows. */ 
#if __USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline 
# include <bits/unistd.h> 
#endif 

En substance, la seule tête nécessaire POSIX est en fait, juste unistd.h , le reste est soit des extensions, soit des définitions du noyau. Donc, juste en incluant unistd.h est tout ce que vous avez à vous soucier de faire, tout ce dont vous avez besoin sera tiré en fonction de votre architecture et de toutes les options de construction que vous avez sélectionné.

3

C'est une technique courante en C et C++ - vous avez un seul fichier avec le nom "standard" à l'endroit "standard", dans ce cas ./unistd.h, et ensuite ce fichier contient une ou plusieurs implémentations des fichiers spécifiques, en fonction des macros du préprocesseur. Si vous regardez presque tous les fichiers d'en-tête C ou C++ "standard", vous le verrez en incluant d'autres fichiers qui ne sont mentionnés dans aucune norme.

0

Pensez fondamentalement à /usr/include/unistd.h comme un lien symbolique intelligent. Il indiquera une implémentation correcte en fonction de vos conditions de fonctionnement.

Cela dit, il est parfois difficile de déterminer quelle est cette implémentation correcte.

Questions connexes