D'où provient uname -i
l'information?
Les détails existent-ils en /etc/
?
Les détails existent-ils en /proc/
?
Si oui, à quel fichier fait-il référence pour produire ces détails?
command-line
kernel
Roy Hernandez
la source
la source
Réponses:
uname
utilise l'appel systèmeuname(2)
pour obtenir les informations relatives au noyau qu'il affiche.Le synopsis est:
où
uname(2)
renvoie des informations dans la structure pointée parbuf
. Vous pouvez également lire le fichier d' en- têteutsname.h
de/usr/include/"$(arch)"-linux-gnu/sys/utsname.h
creuser plus profond.Jetez un oeil à
man 2 uname
pour avoir plus d'idée à ce sujet.la source
locate --regex '^/usr/include/.*/sys/utsname.h$'
?uname -i
la sortie estx86_64
. Quand j'exécutelocate --regex '^/usr/include/.*/sys/utsname.h$'
la sortie revient/usr/include/x86_64-linux-gnu/sys/utsname.h
Le programme
strace
nous permet de visualiser les appels système qu'une application peut effectuer. Avecuname -a
il est évident que les seulsopen
appels vont aux bibliothèques système, donc techniquement il n'y a pas de fichier sur le système de fichiers quiuname
s'ouvre pour la lecture. Il effectue plutôt des appels système à l'aide des bibliothèques C.Comme heemayl l'a souligné à juste titre, il existe un appel sys pour récupérer les informations stockées dans la
uname
structure. C'est la page de manuel, suggère ce qui suit:/proc
le système de fichiers est cependant virtuel, ce qui signifie qu'il n'existe que lorsque le système d'exploitation est en cours d'exécution. Ainsi, dans une certaine mesure, il est défini dans le noyau ou les bibliothèques système.Enfin, en parcourant le code source
uname.c
dont on peut se procurer avecapt-get source coreutils
, on constate qu'il utilise bien lautsname.h
bibliothèque (imprimée avec des numéros de ligne):strace
sortie:la source
uname.c
n'est pas nécessairement nécessaire d'utiliser une bibliothèque pour cela - nous pouvons bien sûr regarder le code source.machine.h
machine.h
semble être parsemé dans tout le système.machine.h
Sur quel fichier s'appuie-t-il?machine.h
sur mon système semblent être dans le/usr/src/linux-headers-3.19.0-33
répertoire. Il est très probable qu'il utilise la bibliothèque fournie par le noyau en cours d'exécutionBien sûr, la réponse de heemayl est correcte.
Juste pour le plaisir, voici un extrait de travail C présentant les données retournées par
uname()
(une sorte de maisonuname
si vous le souhaitez): compilez-legcc uname.c -o uname
et exécutez-le avec./uname
:la source
printf("%\n", utsname.machine);
extraction de ses informations?utsname
, qui est remplie lors de l'appel àuname()
. L'exemple n'est probablement pas trop simple pour quelqu'un qui n'a pas les bases de C, mais voici plus ou moins ce qui se passe: unstruct
(type de données C) de typeutsname
nomméutsname
(type défini dans<sys/utsname.h>
) est déclaré; puis un pointeur sur celui-ci nomméutsname_ptr
est déclaré (puisqu'iluname()
accepte un pointeur sur unstruct
typeutsname
comme argument, bien que cela aurait pu être évité dans ce cas, mais c'est une autre histoire).uname()
a pour effet de remplir la structureutsname
qui, au moment de l'printf()
appel, contient les différentes valeurs à l'intérieur des différents champs. Malheureusement, si vous n'êtes pas familier avec C, cela ne sera probablement pas facile à saisir en détail, mais le fait est qu'iluname()
remplit une structure de données construite à dessein, dont les champs sont ensuite imprimés viaprintf()
.En complément de la réponse de heemayl, vous pouvez obtenir des informations comme dans la
uname
commande de/proc/version
.la source