Як я можу знати, який файл 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?


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.

Отже, якщо ви хочете знати повний перелік файлів, що включені, ви можете проглядати # 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++.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.