私はLinux 2.6.32-26-generic
にいます
「ioctl.h」ヒアラーファイルのLinuxソースコードを見ると、多くの亜種が見つかりました。 (異なるプラットフォームでは、私は推測します)。つまり.
./fs/ocfs2/ioctl.h
./fs/btrfs/ioctl.h
./fs/ceph/ioctl.h
./include/config/i2o/config/old/ioctl.h
./include/asm-generic/ioctl.h
./include/linux/hdlc/ioctl.h
./include/linux/ioctl.h
./drivers/video/via/ioctl.h
./drivers/staging/vt6655/ioctl.h
./drivers/staging/vt6656/ioctl.h
./Arch/ia64/include/asm/ioctl.h
./Arch/h8300/include/asm/ioctl.h
./Arch/microblaze/include/asm/ioctl.h
./Arch/score/include/asm/ioctl.h
./Arch/avr32/include/asm/ioctl.h
./Arch/alpha/include/asm/ioctl.h
./Arch/x86/include/asm/ioctl.h
./Arch/m32r/include/asm/ioctl.h
./Arch/mn10300/include/asm/ioctl.h
./Arch/sparc/include/asm/ioctl.h
./Arch/powerpc/include/asm/ioctl.h
./Arch/m68k/include/asm/ioctl.h
./Arch/sh/include/asm/ioctl.h
./Arch/xtensa/include/asm/ioctl.h
./Arch/mips/include/asm/ioctl.h
./Arch/s390/include/asm/ioctl.h
./Arch/arm/include/asm/ioctl.h
./Arch/blackfin/include/asm/ioctl.h
./Arch/frv/include/asm/ioctl.h
./Arch/parisc/include/asm/ioctl.h
./Arch/cris/include/asm/ioctl.h
しかし、そのファイルが#include <sys/ioctl.h>
として含まれているのがわかります
このマッピングはどのように機能しますか?
含まれているファイルは/usr/include/sys/ioctl.h
(/ usr/src/linuxなどからではない)だと思います。また、私のシステムでは、カーネルやカーネルヘッダーではなく、glibcに属しています。
実際、カーネルソースには何も含まれていません。/usr/src/linux(など)内のヘッダーは、カーネルのコンパイルにのみ使用されています。一部のソフトウェアがコンパイルにカーネルヘッダーを必要とする場合、/usr/include/linux
(および他のいくつか)のヘッダーを使用します。これらは通常、kernel-headers
またはlinux-headers
のようなパッケージの一部です。
インクルードファイルのデフォルトの検索パスは/usr/include
です。これはCコンパイラのプロパティであり、理論的にはコンパイラごとに異なるパスを使用できますが、実際にはすべて/usr/include
(および他のいくつかのコンパイラ依存の場所)を参照します。
#include <sys/ioctl.h>
は、インクルードパスのエントリを基準にしてsys/ioctl.h
というファイルを検索することを意味するため、/usr/include/sys/ioctl.h
となります。
カーネルモジュール(またはカーネル自体)をコンパイルしない限り、カーネルソースのヘッダーは関係ありません。ユーザーランドプログラムのヘッダーは、CライブラリまたはCコンパイラに付属しています。