12

I have several unistd.h files in my Ubuntu Linux. I've one on /usr/include/asm/unistd.h. This file has this directives:

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

In that folder, I can find those files (unistd_32.h and unistd_64.h).

But in /usr/src/linux-headers-2.6.31-22/include/asm-generic/ there's another unistd.h that starts with this directives:

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

So, the question is: How can I know which one is loaded? Is there any way to check it in runtime with Java?

dr_
  • 28,763
  • 21
  • 89
  • 133
santiago.basulto
  • 395
  • 1
  • 3
  • 8
  • 1
    I don't understand the second half of your question: `unistd.h` is a C header file; what has it got to do with Java? – Riccardo Murri Sep 07 '10 at 09:34
  • @Riccardo I would like to make some System Calls, that are defined in that file. – santiago.basulto Sep 07 '10 at 11:48
  • @user1531 Header files are included as the very first step of compilation, so they are not needed at runtime (you can run code on a system that has no compiler or development environment installed). Calling C functions from Java is a topic for an [entirely different question](http://unix.stackexchange.com/questions/1681/invoke-syscalls-from-java) - that you seem to have already asked :-) – Riccardo Murri Sep 07 '10 at 12:28

1 Answers1

13

The exact rules followed by the gcc compiler for finding include files are explained at: http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

A quick command-line trick to find out where an include file comes from is the following:1

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

Then, if you look at the unistd.preprocessed file, you will notice lines like:

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

These tell you that the following block of lines (until the next # number ... line) come from file /usr/include/unistd.h.

So, if you want to know the full list of files included, you can grep for the # number lines:

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

On my Ubuntu 10.04 / gcc 4.4.3 system, this produces:

$ 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 Note: The search path for include files is modified by the -I command-line option; so, you should add any -I path arguments to the gcc invocation. Also, if you are compiling a C++ source, you should substitute -x c with -x c++.

Mikel
  • 56,387
  • 13
  • 130
  • 149
Riccardo Murri
  • 16,238
  • 4
  • 56
  • 46