我在Linux 2.6.32-26-generic
当我查看“ioctl.h”监听器文件的 Linux 源代码时,我可以看到许多变体。 (我猜对于不同的平台)。 IE
./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>
这个映射是如何工作的?
答案1
我相信包含的文件是/usr/include/sys/ioctl.h
(不是来自 /usr/src/linux 或其他)。在我的系统上它属于 glibc,而不是内核或内核头。
实际上,内核源代码中没有包含任何内容 - /usr/src/linux(或其他)内的标头仅用于内核编译。如果某些软件需要一些内核头文件来编译,它会使用/usr/include/linux
(以及其他一些)中的内核头文件,这些头文件通常是类似kernel-headers
或 之类的包的一部分linux-headers
。
答案2
包含文件的默认搜索路径是/usr/include
.这是 C 编译器的属性,理论上不同的编译器可以使用不同的路径,但实际上它们都会查找/usr/include
(以及其他一些与编译器相关的位置)。
#include <sys/ioctl.h>
表示查找sys/ioctl.h
相对于包含路径中的条目调用的文件,因此/usr/include/sys/ioctl.h
.
除非您正在编译内核模块(或内核本身),否则内核源代码中的标头不相关。用户态程序的头文件随 C 库或 C 编译器一起提供。