Cabeçalho "sys / ioctl.h" no linux

8

Estou em Linux 2.6.32-26-generic

Quando olho para o código-fonte do Linux para o arquivo ouvinte "ioctl.h", pude ver muitas variantes. (para plataformas diferentes, eu acho). 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

Mas vejo esse arquivo sendo incluído como #include <sys/ioctl.h>

Como esse mapeamento funciona?

hari
fonte
Isso é mais apropriado stackoverflow?
hari

Respostas:

5

Eu acredito que o arquivo está sendo incluído é /usr/include/sys/ioctl.h(não de / usr / src / linux ou algum). E no meu sistema pertence à glibc, não ao kernel ou ao kernel-headers.

Na verdade, nada é incluído no código-fonte do kernel - cabeçalhos dentro de / usr / src / linux (mais ou menos) estão sendo usados ​​apenas para compilação do kernel. Se algum software precisar de alguns cabeçalhos do kernel para compilar, ele será usado em /usr/include/linux(e alguns outros), que geralmente fazem parte do pacote como kernel-headersou linux-headers.

rvs
fonte
3

O caminho de pesquisa padrão para arquivos de inclusão é /usr/include. Essa é uma propriedade do compilador C e, em teoria, diferentes compiladores podem usar caminhos diferentes, mas, na prática, todos procuram /usr/include(e alguns outros locais dependentes do compilador).

#include <sys/ioctl.h>significa procurar um arquivo chamado sys/ioctl.hrelativamente a uma entrada no caminho de inclusão, portanto /usr/include/sys/ioctl.h.

Os cabeçalhos na fonte do kernel não são relevantes, a menos que você esteja compilando um módulo do kernel (ou o próprio kernel). Os cabeçalhos dos programas da terra do usuário vêm com a biblioteca C ou com o compilador C.

Gilles 'SO- parar de ser mau'
fonte