나는 여기 있다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>
이 매핑은 어떻게 작동하나요?
답변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 컴파일러와 함께 제공됩니다.