Comment savoir quel fichier unistd.h est chargé?

11

J'ai plusieurs unistd.hfichiers dans mon Ubuntu Linux. J'en ai un /usr/include/asm/unistd.h. Ce fichier a ces directives:

# ifdef __i386__
#  include "unistd_32.h"
# else
#  include "unistd_64.h"
# endif

Dans ce dossier, je peux trouver ces fichiers ( unistd_32.het unistd_64.h).

Mais /usr/src/linux-headers-2.6.31-22/include/asm-generic/il y en a un autre unistd.hqui commence par ces directives:

#if !defined(_ASM_GENERIC_UNISTD_H) || defined(__SYSCALL)
#define _ASM_GENERIC_UNISTD_H

Donc, la question est: comment puis-je savoir lequel est chargé? Existe-t-il un moyen de le vérifier lors de l'exécution avec Java?

santiago.basulto
la source
1
Je ne comprends pas la deuxième moitié de votre question: unistd.hest un fichier d'en-tête C; qu'est-ce que cela a à voir avec Java?
Riccardo Murri
@Riccardo Je voudrais faire quelques appels système, qui sont définis dans ce fichier.
santiago.basulto
@ user1531 Les fichiers d'en-tête sont inclus comme la toute première étape de la compilation, ils ne sont donc pas nécessaires au moment de l'exécution (vous pouvez exécuter du code sur un système sur lequel aucun compilateur ou environnement de développement n'est installé). L'appel de fonctions C à partir de Java est un sujet pour une question entièrement différente - que vous semblez avoir déjà posée :-)
Riccardo Murri

Réponses:

12

Les règles exactes suivies par le gcccompilateur pour trouver les fichiers include sont expliquées à: http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

Une astuce en ligne de commande rapide pour savoir d'où vient un fichier include est la suivante: 1

echo '#include <unistd.h>' | gcc -E -x c - > unistd.preprocessed

Ensuite, si vous regardez le unistd.preprocessedfichier, vous remarquerez des lignes comme:

# 1 "/usr/include/unistd.h" <some numbers>

Ceux-ci vous indiquent que le bloc de lignes suivant (jusqu'à la # number ...ligne suivante ) provient du fichier /usr/include/unistd.h.

Donc, si vous voulez connaître la liste complète des fichiers inclus, vous pouvez rechercher les # numberlignes:

echo '#include <unistd.h>' | gcc -E -x c - | egrep '# [0-9]+ ' | awk '{print $3;}' | sort -u*emphasized text*

Sur mon système Ubuntu 10.04 / gcc 4.4.3, cela produit:

$ echo '#include <unistd.h>' | gcc -E -x c - | egrep '# [0-9]+ ' | awk '{print $3;}' | sort -u
"<built-in>"
"<command-line>"
"<stdin>"
"/usr/include/bits/confname.h"
"/usr/include/bits/posix_opt.h"
"/usr/include/bits/predefs.h"
"/usr/include/bits/types.h"
"/usr/include/bits/typesizes.h"
"/usr/include/bits/wordsize.h"
"/usr/include/features.h"
"/usr/include/getopt.h"
"/usr/include/gnu/stubs-64.h"
"/usr/include/gnu/stubs.h"
"/usr/include/sys/cdefs.h"
"/usr/include/unistd.h"
"/usr/lib/gcc/x86_64-linux-gnu/4.4.3/include/stddef.h"

1 Remarque: Le chemin de recherche des fichiers d'inclusion est modifié par l' -Ioption de ligne de commande; vous devez donc ajouter des -I path arguments à l' gccinvocation. De plus, si vous compilez une source C ++, vous devez remplacer -x cpar -x c++.

Riccardo Murri
la source