De onde está uname -i
tirando a informação?
Os detalhes existem /etc/
?
Os detalhes existem /proc/
?
Em caso afirmativo, qual arquivo está fazendo referência para gerar esses detalhes?
command-line
kernel
Roy Hernandez
fonte
fonte
Respostas:
uname
usa a chamada do sistemauname(2)
para obter as informações relacionadas ao kernel que mostra.A sinopse é:
onde
uname(2)
retorna informações na estrutura apontada porbuf
. Além disso, você pode ler o arquivoutsname.h
do cabeçalho/usr/include/"$(arch)"-linux-gnu/sys/utsname.h
para se aprofundar.Dê uma olhada
man 2 uname
para ter mais idéia sobre isso.fonte
locate --regex '^/usr/include/.*/sys/utsname.h$'
?uname -i
a saída éx86_64
. Quando eu executolocate --regex '^/usr/include/.*/sys/utsname.h$'
a saída retorna/usr/include/x86_64-linux-gnu/sys/utsname.h
O programa
strace
nos permite visualizar as chamadas do sistema que um aplicativo pode fazer. Comouname -a
é evidente, as únicasopen
chamadas são para as bibliotecas do sistema; portanto, tecnicamente, não há nenhum arquivo no sistema de arquivos que eleuname
abra para leitura. Em vez disso, ele faz chamadas de sistema usando as bibliotecas C.Como o heemayl apontou corretamente, existe o sys call para recuperar as informações armazenadas na
uname
estrutura. É a página de manual, sugere o seguinte:/proc
O sistema de arquivos, no entanto, é virtual, o que significa que existe apenas enquanto o sistema operacional está em execução. Assim, até certo ponto, ele é definido nas bibliotecas do kernel ou do sistema.Finalmente, lendo o código fonte do
uname.c
qual pode ser obtidoapt-get source coreutils
, podemos ver que ele realmente usa autsname.h
biblioteca (impressa com números de linha):strace
saída:fonte
uname.c
não é necessário usar uma biblioteca para isso - podemos ver o código fonte, é claro, para ter certeza.machine.h
machine.h
parece estar apimentado em todo o sistema. Em qualmachine.h
arquivo ele se baseia?machine.h
no meu sistema parecem estar no/usr/src/linux-headers-3.19.0-33
diretório É muito provável que ele use a biblioteca fornecida pelo kernel atualmente em execuçãoÉ claro que a resposta de heemayl está correta.
Apenas por diversão, aqui está um trecho de C em funcionamento que mostra os dados retornados por
uname()
(uma espécie de caseiro,uname
se você quiser): compile-ogcc uname.c -o uname
e execute-o com./uname
:fonte
printf("%\n", utsname.machine);
informações?utsname
, que é preenchida durante a chamada parauname()
. O exemplo provavelmente não é muito simples para alguém sem o básico de C, mas aqui está mais ou menos o que acontece: umstruct
(tipo de dados C) do tipoutsname
nomeadoutsname
(tipo definido em<sys/utsname.h>
) é declarado; então, um ponteiro para o nomeutsname_ptr
é declarado (uma vez queuname()
aceita um ponteiro para umstruct
do tipoutsname
como argumento, embora isso possa ter sido evitado nesse caso, mas essa é outra história).uname()
tem o efeito de preencher a estruturautsname
, que no momento daprintf()
chamada contém os vários valores dentro dos vários campos. Infelizmente, se você não estiver familiarizado com C, isso provavelmente não será fácil de entender em detalhes, mas o ponto é queuname()
preenche uma estrutura de dados criada de propósito, cujos campos são impressos posteriormenteprintf()
.Como complemento à resposta de heemayl, você pode obter algumas informações, como no
uname
comando/proc/version
.fonte