¿Cómo puedo saber qué archivo unistd.h está cargado?

11

Tengo varios unistd.harchivos en mi Ubuntu Linux. Tengo uno en /usr/include/asm/unistd.h. Este archivo tiene estas directivas:

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

En esa carpeta, puedo encontrar esos archivos ( unistd_32.hy unistd_64.h).

Pero /usr/src/linux-headers-2.6.31-22/include/asm-generic/hay otra unistd.hque comienza con estas directivas:

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

Entonces, la pregunta es: ¿cómo puedo saber cuál está cargado? ¿Hay alguna forma de verificarlo en tiempo de ejecución con Java?

santiago.basulto
fuente
1
No entiendo la segunda mitad de su pregunta: unistd.hes un archivo de encabezado C; ¿Qué tiene que ver con Java?
Riccardo Murri
@ Riccardo Me gustaría hacer algunas llamadas al sistema, que están definidas en ese archivo.
santiago.basulto
@ user1531 Los archivos de encabezado se incluyen como el primer paso de la compilación, por lo que no son necesarios en tiempo de ejecución (puede ejecutar código en un sistema que no tiene instalado un compilador o entorno de desarrollo). Llamar a funciones de C desde Java es un tema para una pregunta completamente diferente , que parece que ya ha preguntado :-)
Riccardo Murri

Respuestas:

12

Las reglas exactas seguidas por el gcccompilador para encontrar archivos de inclusión se explican en: http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

Un truco rápido en la línea de comandos para averiguar de dónde proviene un archivo de inclusión es el siguiente: 1

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

Luego, si mira el unistd.preprocessedarchivo, notará líneas como:

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

Estos le indican que el siguiente bloque de líneas (hasta la siguiente # number ...línea) proviene del archivo /usr/include/unistd.h.

Entonces, si desea conocer la lista completa de archivos incluidos, puede buscar las # numberlíneas:

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

En mi sistema Ubuntu 10.04 / gcc 4.4.3, esto produce:

$ 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: La ruta de búsqueda para incluir archivos se modifica mediante la -Iopción de línea de comandos; por lo tanto, debe agregar cualquier -I path argumento a la gccinvocación. Además, si está compilando una fuente C ++, debe sustituirla -x cpor -x c++.

Riccardo Murri
fuente