Comandos ls
, stat
ou até file
usam internamente a chamada do sistema C stat()
para reunir os detalhes. Aqui as estruturas são definidas. Se você verificar os arquivos de estatísticas:
-
/usr/include/bits/stat.h
-
/usr/include/linux/stat.h
Os seguintes bits são definidos:
/* Encoding of the file mode. */
#define __S_IFMT 0170000 /* These bits determine file type. */
/* File types. */
#define __S_IFDIR 0040000 /* Directory. */
#define __S_IFCHR 0020000 /* Character device. */
#define __S_IFBLK 0060000 /* Block device. */
#define __S_IFREG 0100000 /* Regular file. */
#define __S_IFIFO 0010000 /* FIFO. */
#define __S_IFLNK 0120000 /* Symbolic link. */
#define __S_IFSOCK 0140000 /* Socket. */
the stat function will check the POSIX macros and compare to see if it is a regular file/ directory
#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
É assim que st_mode
obtém esses valores S_IFDIR
e S_IFREG
.
Apenas FYI ... Agora, para uma pergunta principal sobre como os inodes identificam o tipo de arquivo é:
Para o sistema de arquivos XFS, uma estrutura de dados inode é dividida em 3 partes:
-
di_core
(96 bytes)
-
di_u
data fork
-
di_a
atributo estendido garfo
O núcleo contém o que o inode representa, os dados estatísticos e as informações que descrevem os dados e os forks de atributos. Aqui o tipo de arquivo é controlado por di_core.di_mode
(por exemplo, arquivo regular, diretório, link, etc).
A bifurcação de dados di_u
"contém dados normais relacionados ao inode.
O fork do atributo di_a
"contém atributos estendidos.