Откуда uname -i
берется информация?
Существуют ли детали в /etc/
?
Существуют ли детали в /proc/
?
Если да, то на какой файл он ссылается для вывода этих деталей?
command-line
kernel
Рой Эрнандес
источник
источник
Ответы:
uname
использует системный вызовuname(2)
для получения информации, относящейся к ядру.Краткое содержание:
где
uname(2)
возвращает информацию в структуре, на которую указываетbuf
. Также вы можете прочитать файл заголовкаutsname.h
из/usr/include/"$(arch)"-linux-gnu/sys/utsname.h
копать глубже.Посмотрите,
man 2 uname
чтобы получить больше представления об этом.источник
locate --regex '^/usr/include/.*/sys/utsname.h$'
?uname -i
выводx86_64
. Когда я запускаюlocate --regex '^/usr/include/.*/sys/utsname.h$'
выходной возвращается/usr/include/x86_64-linux-gnu/sys/utsname.h
Программа
strace
позволяет нам просматривать системные вызовы, которые может выполнять приложение. Сuname -a
это очевидно , что толькоopen
звонки идут в системные библиотеки, так что технически нет файла в файловой системе , чтоuname
открывает для чтения. Скорее это делает системные вызовы, используя библиотеки C.Как правильно указал Heemayl, существует системный вызов для извлечения информации, хранящейся в
uname
структуре. Это страница руководства, предлагает следующее:/proc
Однако файловая система является виртуальной, то есть она существует только во время работы ОС. Таким образом, в некоторой степени это устанавливается в ядре или системных библиотеках.Наконец, читая исходный код,
uname.c
который можно получить с помощьюapt-get source coreutils
, мы видим, что он действительно используетutsname.h
библиотеку (напечатанную с номерами строк):strace
выход:источник
uname.c
этого не обязательно использовать библиотеку - мы можем, конечно, взглянуть на исходный код.machine.h
machine.h
кажется, пронизано всей системой. На какойmachine.h
файл он опирается?machine.h
в моей системе, похоже, находятся в/usr/src/linux-headers-3.19.0-33
каталоге. Весьма вероятно, что он использует библиотеку, предоставляемую в настоящее время работающим ядромКонечно, ответ Химейла правильный.
Просто для удовольствия, вот рабочий фрагмент C, демонстрирующий возвращаемые данные
uname()
(своего рода самодельный,uname
если хотите): скомпилируйте егоgcc uname.c -o uname
и запустите с помощью./uname
:источник
printf("%\n", utsname.machine);
берется информация?utsname
, которая заполняется во время вызоваuname()
. Этот пример, вероятно, не слишком прост для тех, кто не знает основ C, но вот более или менее то, что происходит: объявленstruct
(тип данных C) типаutsname
namedutsname
(тип, определенный в<sys/utsname.h>
); затемutsname_ptr
объявляется указатель на него с именем (так как в качестве аргументаuname()
принимает указатель наstruct
типutsname
, хотя этого можно было бы избежать в этом случае, но это уже другая история).uname()
заполняет структуруutsname
, которая во времяprintf()
вызова содержит различные значения внутри различных полей. К сожалению, если вы не знакомы с C, это, вероятно, не будет легко понять подробно, но дело в том, чтоuname()
заполняет структуру данных, созданную специально, поля которой впоследствии распечатываютсяprintf()
.В дополнение к ответу Heemayl, вы можете получить некоторую информацию, как в
uname
команде от/proc/version
.источник