Wie kann ich wissen, welche unistd.h-Datei geladen ist?

11

Ich habe mehrere unistd.hDateien in meinem Ubuntu Linux. Ich habe eins an /usr/include/asm/unistd.h. Diese Datei hat folgende Anweisungen:

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

In diesem Ordner kann ich diese Dateien ( unistd_32.hund unistd_64.h) finden.

Aber es /usr/src/linux-headers-2.6.31-22/include/asm-generic/gibt noch eine andere unistd.h, die mit diesen Anweisungen beginnt:

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

Die Frage ist also: Wie kann ich wissen, welche geladen ist? Gibt es eine Möglichkeit, dies zur Laufzeit mit Java zu überprüfen?

santiago.basulto
quelle
1
Ich verstehe die zweite Hälfte Ihrer Frage nicht: unistd.hist eine C-Header-Datei; Was hat das mit Java zu tun?
Riccardo Murri
@ Riccardo Ich möchte einige Systemaufrufe tätigen, die in dieser Datei definiert sind.
Santiago.basulto
@ user1531 Header-Dateien sind als allererster Schritt der Kompilierung enthalten, sodass sie zur Laufzeit nicht benötigt werden (Sie können Code auf einem System ausführen, auf dem kein Compiler oder keine Entwicklungsumgebung installiert ist). Das Aufrufen von C-Funktionen aus Java ist ein Thema für eine ganz andere Frage - die Sie anscheinend bereits gestellt haben :-)
Riccardo Murri

Antworten:

12

Die genauen Regeln, die der gccCompiler zum Auffinden von Include-Dateien befolgt , werden unter folgender Adresse erläutert: http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

Ein schneller Befehlszeilentrick, um herauszufinden, woher eine Include-Datei stammt, ist folgender: 1

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

Wenn Sie sich die unistd.preprocessedDatei ansehen , werden Sie folgende Zeilen bemerken:

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

Diese sagen Ihnen, dass der folgende Zeilenblock (bis zur nächsten # number ...Zeile) aus der Datei stammt /usr/include/unistd.h.

Wenn Sie also die vollständige Liste der enthaltenen Dateien wissen möchten, können Sie nach den # numberZeilen suchen :

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

Auf meinem Ubuntu 10.04 / gcc 4.4.3-System ergibt dies:

$ 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 Hinweis: Der Suchpfad für Include-Dateien wird durch die -IBefehlszeilenoption geändert . Daher sollten Sie -I path dem gccAufruf alle Argumente hinzufügen . Auch, wenn Sie eine C ++ Quelle kompilieren, sollten Sie ersetzen -x cmit -x c++.

Riccardo Murri
quelle