web-dev-qa-db-ja.com

Linuxの「sys / ioctl.h」ヘッダー

私は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>として含まれているのがわかります

このマッピングはどのように機能しますか?

8
hari

含まれているファイルは/usr/include/sys/ioctl.h(/ usr/src/linuxなどからではない)だと思います。また、私のシステムでは、カーネルやカーネルヘッダーではなく、glibcに属しています。

実際、カーネルソースには何も含まれていません。/usr/src/linux(など)内のヘッダーは、カーネルのコンパイルにのみ使用されています。一部のソフトウェアがコンパイルにカーネルヘッダーを必要とする場合、/usr/include/linux(および他のいくつか)のヘッダーを使用します。これらは通常、kernel-headersまたはlinux-headersのようなパッケージの一部です。

5
rvs

インクルードファイルのデフォルトの検索パスは/usr/includeです。これはCコンパイラのプロパティであり、理論的にはコンパイラごとに異なるパスを使用できますが、実際にはすべて/usr/include(および他のいくつかのコンパイラ依存の場所)を参照します。

#include <sys/ioctl.h>は、インクルードパスのエントリを基準にしてsys/ioctl.hというファイルを検索することを意味するため、/usr/include/sys/ioctl.hとなります。

カーネルモジュール(またはカーネル自体)をコンパイルしない限り、カーネルソースのヘッダーは関係ありません。ユーザーランドプログラムのヘッダーは、CライブラリまたはCコンパイラに付属しています。