Como posso saber qual arquivo unistd.h está carregado?

11

Eu tenho vários unistd.harquivos no meu Ubuntu Linux. Eu tenho um /usr/include/asm/unistd.h. Este arquivo tem estas diretivas:

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

Nessa pasta, posso encontrar esses arquivos ( unistd_32.he unistd_64.h).

Mas /usr/src/linux-headers-2.6.31-22/include/asm-generic/há outro unistd.hque começa com essas diretrizes:

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

Portanto, a pergunta é: como posso saber qual deles está carregado? Existe alguma maneira de verificá-lo em tempo de execução com Java?

santiago.basulto
fonte
1
Não entendo a segunda metade da sua pergunta: unistd.hé um arquivo de cabeçalho C; o que isso tem a ver com Java?
Riccardo Murri
@ Riccardo Gostaria de fazer algumas chamadas de sistema, definidas nesse arquivo.
Santiago.basulto
@ user1531 Os arquivos de cabeçalho são incluídos como a primeira etapa da compilação, portanto, não são necessários no tempo de execução (você pode executar o código em um sistema que não possui um compilador ou ambiente de desenvolvimento instalado). Chamar funções C de Java é um tema para uma questão totalmente diferente - que você parece já ter perguntado :-)
Riccardo Murri

Respostas:

12

As regras exatas seguidas pelo gcccompilador para localizar arquivos de inclusão são explicadas em: http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

Um truque rápido da linha de comando para descobrir de onde vem um arquivo de inclusão é o seguinte: 1

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

Então, se você olhar para o unistd.preprocessedarquivo, notará linhas como:

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

Eles informam que o seguinte bloco de linhas (até a próxima # number ...linha) vem do arquivo /usr/include/unistd.h.

Portanto, se você quiser conhecer a lista completa de arquivos incluídos, poderá fazer o grep para as # numberlinhas:

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

No meu sistema Ubuntu 10.04 / gcc 4.4.3, isso produz:

$ 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 Nota: O caminho de pesquisa para incluir arquivos é modificado pela -Iopção de linha de comando; portanto, você deve adicionar -I path argumentos à gccinvocação. Além disso, se você estiver compilando uma fonte C ++, substitua -x cpor -x c++.

Riccardo Murri
fonte