Skąd mam wiedzieć, który plik unistd.h jest załadowany?

11

Mam kilka unistd.hplików w moim systemie Ubuntu Linux. Mam jeden na /usr/include/asm/unistd.h. Ten plik ma następujące dyrektywy:

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

W tym folderze mogę znaleźć te pliki ( unistd_32.hi unistd_64.h).

Ale /usr/src/linux-headers-2.6.31-22/include/asm-generic/jest jeszcze jedna, unistd.hktóra zaczyna się od tych dyrektyw:

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

Pytanie brzmi: skąd mam wiedzieć, który jest załadowany? Czy jest jakiś sposób, aby to sprawdzić w środowisku wykonawczym w Javie?

santiago.basulto
źródło
1
Nie rozumiem drugiej połowy twojego pytania: unistd.hto plik nagłówka C; co to ma wspólnego z Javą?
Riccardo Murri,
@ Riccardo Chciałbym wykonać kilka wywołań systemowych zdefiniowanych w tym pliku.
santiago.basulto
@ user1531 Pliki nagłówkowe są dołączane jako pierwszy krok kompilacji, więc nie są potrzebne w czasie wykonywania (możesz uruchomić kod w systemie, w którym nie ma zainstalowanego kompilatora ani środowiska programistycznego). Wywoływanie funkcji C z Javy jest tematem na zupełnie inne pytanie - które zdaje się już zadawać :-)
Riccardo Murri

Odpowiedzi:

12

Dokładne zasady stosowane przez gcckompilator do znajdowania plików dołączanych są wyjaśnione na stronie : http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

Szybka sztuczka z wiersza poleceń, aby dowiedzieć się, skąd pochodzi plik dołączenia, jest następująca: 1

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

Następnie, jeśli spojrzysz na unistd.preprocessedplik, zauważysz linie takie jak:

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

Informują one, że następujący blok linii (do następnego # number ...wiersza) pochodzi z pliku /usr/include/unistd.h.

Więc jeśli chcesz poznać pełną listę dołączonych plików, możesz grep dla # numberlinii:

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

W moim systemie Ubuntu 10.04 / gcc 4.4.3 powoduje to:

$ 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 Uwaga: Ścieżka wyszukiwania plików dołączanych jest modyfikowana przez -Iopcję wiersza poleceń; dlatego powinieneś dodać wszelkie -I path argumenty do gccwywołania. Ponadto, jeśli są kompilacji C ++ źródła, należy zastąpić -x cz -x c++.

Riccardo Murri
źródło