Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

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?

Thanks!

share|improve this question
    
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 7 '10 at 9:34
    
@Riccardo I would like to make some System Calls, that are defined in that file. –  santiago.basulto Sep 7 '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 - that you seem to have already asked :-) –  Riccardo Murri Sep 7 '10 at 12:28

1 Answer 1

up vote 4 down vote accepted

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++.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.