Skąd ta uname -i
informacja?
Czy szczegóły istnieją w /etc/
?
Czy szczegóły istnieją w /proc/
?
Jeśli tak, to który plik zawiera dane wyjściowe?
command-line
kernel
Roy Hernandez
źródło
źródło
Odpowiedzi:
uname
używa wywołania systemowego,uname(2)
aby wyświetlić wyświetlane informacje dotyczące jądra.Streszczenie to:
gdzie
uname(2)
zwraca informacje w strukturze wskazanej przezbuf
. Ponadto można odczytać pliku nagłówkautsname.h
z/usr/include/"$(arch)"-linux-gnu/sys/utsname.h
kopać głębiej.Sprawdź,
man 2 uname
aby uzyskać więcej informacji na ten temat.źródło
locate --regex '^/usr/include/.*/sys/utsname.h$'
?uname -i
wyjście jestx86_64
. Po uruchomieniulocate --regex '^/usr/include/.*/sys/utsname.h$'
zwracane dane wyjściowe/usr/include/x86_64-linux-gnu/sys/utsname.h
Program
strace
pozwala nam przeglądać wywołania systemowe, które może wykonywać aplikacja. Zeuname -a
jest to oczywiste, że tylkoopen
połączenia pójść do bibliotek systemowych, więc technicznie nie ma pliku w systemie plików, żeuname
otwiera się na czytaniu. Raczej wykonuje wywołania systemowe za pomocą bibliotek C.Jak heemayl słusznie zauważył, istnieje wywołanie sys do pobierania informacji przechowywanych w
uname
strukturze. Jest to strona podręcznika, sugeruje następujące:/proc
system plików jest jednak wirtualny, co oznacza, że istnieje tylko podczas działania systemu operacyjnego. Dlatego w pewnym stopniu jest on ustawiony w bibliotekach jądra lub bibliotek systemowych.Na koniec, czytając kod źródłowy, za pomocą
uname.c
którego można uzyskaćapt-get source coreutils
, możemy zauważyć, że rzeczywiście korzysta on zutsname.h
biblioteki (wydrukowanej z numerami wierszy):strace
wydajność:źródło
uname.c
niekoniecznie trzeba do tego używać biblioteki - oczywiście możemy spojrzeć na kod źródłowy.machine.h
machine.h
wydaje się być obrzucony całym systemem. Na jakimmachine.h
pliku polega?machine.h
w moim systemie wydają się znajdować w/usr/src/linux-headers-3.19.0-33
katalogu. Jest bardzo prawdopodobne, że korzysta z biblioteki dostarczanej przez obecnie działające jądroOczywiście odpowiedź heemayla jest poprawna.
Dla zabawy, oto działający fragment kodu C przedstawiający dane zwrócone przez
uname()
(rodzaj domowej roboty,uname
jeśli chcesz): skompiluj gogcc uname.c -o uname
i uruchom za pomocą./uname
:źródło
printf("%\n", utsname.machine);
informacja?utsname
, która jest wypełniana podczas połączenia zuname()
. Przykład prawdopodobnie nie jest zbyt prosty dla kogoś bez podstaw języka C, ale mniej więcej to, co się dzieje: zadeklarowano (typstruct
danych C) typu outsname
nazwieutsname
(typ zdefiniowany w<sys/utsname.h>
); następnie wskaźnik do niego nazwanyutsname_ptr
jest zadeklarowana (ponieważuname()
przyjmuje wskaźnik dostruct
typuutsname
jako argument, choć można było uniknąć w tym przypadku, ale to inna historia).uname()
powoduje wypełnienie strukturyutsname
, która w momencieprintf()
wywołania zawiera różne wartości w różnych polach. Niestety, jeśli nie znasz C, prawdopodobnie nie będzie to łatwe do szczegółowego zrozumienia, ale chodzi o to, żeuname()
wypełnia celowo zbudowaną strukturę danych, której pola są później drukowaneprintf()
.Jako dodatek do odpowiedzi heemayla możesz uzyskać pewne informacje jak w
uname
poleceniu z/proc/version
.źródło