Quando executo ls -l /dev
no meu Ubuntu, recebo uma saída como esta:
$ ls -l /dev
total 0
crw-r--r-- 1 root root 10, 235 Aug 24 16:36 autofs
drwxr-xr-x 2 root root 340 Aug 24 16:40 block
crw------- 1 root root 10, 234 Aug 24 16:36 btrfs-control
drwxr-xr-x 2 root root 2660 Aug 24 16:37 char
A 10, 235
quinta coluna mostra os números maiores e menores que especificam qual driver de dispositivo é usado para gerenciar o arquivo.
Quando executo o mesmo comando no macOS, recebo esta saída:
% ls -l /dev
total 1
crw-rw-rw- 1 root wheel 0x16000000 14 Aug 22:16 aes_0
crw------- 1 root wheel 0x15000001 14 Aug 22:16 afsc_type5
brw------- 1 root operator 0x2000000 24 Aug 19:39 apfs-raw-device.2.0
crw------- 1 root wheel 0xb000001 14 Aug 22:16 auditpipe
Em vez dos números maiores/menores, recebo um único número hexadecimal. Minha pergunta é: o que esses números hexadecimais representam?
O que eu tentei/pesquisei
Existem arquivos diferentes que compartilham o mesmo hexadecimal. Então não parece representar os números maiores/menores, pois, pelo que entendi, essa combinação deveria ser única?
brw-r----- 1 root operator 0x1000001 14 Aug 22:16 disk0s1 crw-r----- 1 root operator 0x1000001 14 Aug 22:16 rdisk0s1
ChatGPT tenta me convencer de que o número hexadecimal é um formato compactado para os números maiores e menores, mas não estava sendo muito claro sobre como interpretá-lo. Se eu dividir os 32 bits em metades e interpretar os primeiros 16 bits como maiores e os últimos 16 bits como menores, o número maior parecerá extraordinariamente grande (por exemplo,
0x1d000000
dá7424
como o número maior.Instalar o
coreutils
pacote no meu Mac e usá-ls
lo me deu os familiares pares maiores/menores.$ /opt/homebrew/Cellar/coreutils/9.5/libexec/gnubin/ls -l /dev total 1 crw-rw-rw- 1 root wheel 22, 0 Aug 14 22:16 aes_0 crw------- 1 root wheel 21, 1 Aug 14 22:16 afsc_type5 brw------- 1 root operator 2, 0 Aug 24 21:02 apfs-raw-device.2.0 crw------- 1 root wheel 11, 1 Aug 14 22:16 auditpipe ... brw-r----- 1 root operator 1, 1 Aug 14 22:16 disk0s1 ... crw-r----- 1 root operator 1, 1 Aug 14 22:16 rdisk0s1
Se acreditarmos nas
major()
macrosminor()
emmakedev()
https://github.com/apple-oss-distributions/xnu/blob/xnu-10063.141.1/bsd/sys/types.h#L161 nas fontes XNU que a Apple disponibiliza, o número menor é armazenado nos 24 bits mais baixos dost_rdev
campo na estrutura retornada porlstat()
e o número maior nos 8 bits mais altos (o restante, para um total de 32 bits).Isso é consistente com os resultados obtidos com o ls do macos e do GNU:
0x16000000 e 0x15000001 sendo apenas o valor bruto
st_rdev
em hexadecimal.Observe que, em qualquer caso, o formato do campo "informações do dispositivo" na
ls -l
saída é deixado como "implementação definida" pelo POSIX . Embora a maioria dos outros sistemas mostrem o maior e o menor separadamente, o formato em que eles variam de implementação para implementação, alguns se separando em dois campos como GNUls
, alguns não, ou nem sempre, alguns com preenchimento 0... Um dos muitos razões pelas quais é quase impossível analisar a saída dels
forma confiável (e portável).