Как я могу узнать, какой файл unistd.h загружен?

11

У меня есть несколько unistd.hфайлов в моем Ubuntu Linux. У меня есть один на /usr/include/asm/unistd.h. Этот файл имеет следующие директивы:

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

В этой папке я могу найти эти файлы ( unistd_32.hи unistd_64.h).

Но /usr/src/linux-headers-2.6.31-22/include/asm-generic/есть еще один, unistd.hкоторый начинается с этой директивы:

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

Итак, вопрос: как я могу узнать, какой из них загружен? Есть ли способ проверить это во время выполнения с Java?

santiago.basulto
источник
1
Я не понимаю вторую половину вашего вопроса: unistd.hэто файл заголовка C; какое отношение это имеет к Java?
Риккардо Мурри
@Riccardo Я хотел бы сделать несколько системных вызовов, которые определены в этом файле.
santiago.basulto
@ user1531 Заголовочные файлы включены в качестве самого первого шага компиляции, поэтому они не нужны во время выполнения (вы можете запускать код в системе, в которой не установлен компилятор или среда разработки). Вызов функций C из Java - тема совершенно другого вопроса, который вы, похоже, уже задавали :-)
Риккардо Мурри,

Ответы:

12

Точные правила, применяемые gccкомпилятором для поиска включаемых файлов, описаны по адресу: http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html.

Быстрый трюк командной строки, чтобы выяснить, откуда берутся включаемые файлы: 1

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

Затем, если вы посмотрите на unistd.preprocessedфайл, вы заметите строки вроде:

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

Они говорят вам, что следующий блок строк (до следующей # number ...строки) происходит из файла /usr/include/unistd.h.

Итак, если вы хотите узнать полный список включенных файлов, вы можете использовать grep для # numberстрок:

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

В моей системе Ubuntu 10.04 / gcc 4.4.3 это выдает:

$ 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 Примечание: путь поиска для включаемых файлов изменяется параметром -Iкомандной строки; Итак, вы должны добавить любые -I path аргументы к gccвызову. Кроме того, если вы компилируете исходный код C ++, вы должны заменить его -x cна -x c++.

Риккардо Мурри
источник