Bagaimana saya bisa tahu file unistd.h mana yang dimuat?

11

Saya memiliki beberapa unistd.hfile di Ubuntu Linux saya. Saya punya satu /usr/include/asm/unistd.h. File ini memiliki arahan ini:

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

Dalam folder itu, saya dapat menemukan file-file itu ( unistd_32.hdan unistd_64.h).

Tetapi /usr/src/linux-headers-2.6.31-22/include/asm-generic/ada satu lagi unistd.hyang dimulai dengan arahan ini:

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

Jadi, pertanyaannya adalah: Bagaimana saya bisa tahu yang mana yang dimuat? Apakah ada cara untuk memeriksanya di runtime dengan Java?

santiago.basulto
sumber
1
Saya tidak mengerti bagian kedua dari pertanyaan Anda: unistd.hapakah file header C; apa hubungannya dengan Java?
Riccardo Murri
@ Riccardo Saya ingin membuat beberapa Panggilan Sistem, yang didefinisikan dalam file itu.
santiago.basulto
@ user1531 File header disertakan sebagai langkah pertama kompilasi, sehingga tidak diperlukan saat runtime (Anda dapat menjalankan kode pada sistem yang tidak memiliki kompiler atau lingkungan pengembangan yang diinstal). Memanggil fungsi C dari Jawa adalah topik untuk pertanyaan yang sama sekali berbeda - yang sepertinya sudah Anda tanyakan :-)
Riccardo Murri

Jawaban:

12

Aturan pasti yang diikuti oleh gcckompiler untuk menemukan file termasuk dijelaskan di: http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

Trik baris perintah cepat untuk mencari tahu dari mana file include berasal adalah sebagai berikut: 1

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

Kemudian, jika Anda melihat unistd.preprocessedfile, Anda akan melihat baris seperti:

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

Ini memberi tahu Anda bahwa blok baris berikut (sampai # number ...baris berikutnya ) berasal dari file /usr/include/unistd.h.

Jadi, jika Anda ingin mengetahui daftar lengkap file yang disertakan, Anda dapat menerima # numberbaris:

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

Pada sistem Ubuntu 10.04 / gcc 4.4.3 saya, ini menghasilkan:

$ 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 Catatan: Jalur pencarian untuk menyertakan file dimodifikasi oleh -Iopsi baris perintah; jadi, Anda harus menambahkan -I path argumen apa pun pada gccdoa. Juga, jika Anda mengkompilasi sumber C ++, Anda harus menggantinya -x cdengan -x c++.

Riccardo Murri
sumber