“Uname” bilgileri nereden alıyor?


Yanıtlar:


31

unameuname(2)gösterdiği çekirdeğe ilişkin bilgiyi almak için sistem çağrısını kullanır .

Özet:

#include <sys/utsname.h>
int uname(struct utsname *buf);

burada gösterilen uname(2)bilgiyi döndürür buf. Ayrıca başlık dosyasını okuyabilir utsname.hgelen /usr/include/"$(arch)"-linux-gnu/sys/utsname.hderin kazmak.

Bu konuda man 2 unamedaha fazla fikir edinmek için bir göz atın .


"uname -i" yi çalıştırdığımda, çıktı "x86_64" olur. "/Usr/include/x86_64-linux-gnu/sys/utsname.h" referansını geçtiğimde, "x86_64" ifadesine başvuran hiçbir şey göremiyorum. "Man 2 uname" ifadesine başvurdum ve utsname bilgisinin bir kısmına "/ proc / sys / kernel / {ostype}, {hostname}, {osrelease}, {version} ve {domainname}" üzerinden başvurulduğunu belirtir. Bu dosyaların hiçbiri "x86_64" belirten bir şey başvuruyor. Başka bir önerin var mı?
Roy Hernandez

@RoyHernandez Çıkışı locate --regex '^/usr/include/.*/sys/utsname.h$'nedir?
heemayl

Çıktı: "/usr/include/x86_64-linux-gnu/sys/utsname.h"
Roy Hernandez

@RoyHernandez Bu dosyanın var olduğunu ve yanlış bir şey yaptığınızı söylüyor ..
heemayl

Çalıştırdığımda uname -içıktı çıktı x86_64. Ben çalıştırdığınızda locate --regex '^/usr/include/.*/sys/utsname.h$'çıkış döner/usr/include/x86_64-linux-gnu/sys/utsname.h
Roy Hernandez

22

Program strace, sisteme bir uygulamanın yapabileceği çağrıları görmemizi sağlıyor. İle uname -abu bariz olan tek o opençağrılar bu yüzden teknik bu dosya sistemi üzerinde dosya olup, sistem kütüphaneleri gidin unameokuma için açılır. Aksine, C kütüphanelerini kullanarak sistem çağrıları yapar.

Heemayl'in doğru şekilde işaret ettiği gibi, unameyapıda depolanan bilgiyi almak için sys çağrısı vardır . Bu adam sayfası, aşağıdakileri önerir:

Bu bir sistem çağrısıdır ve işletim sistemi muhtemelen adını, sürümünü ve sürümünü bilmektedir. . . . . . Utsname bilgisinin bir kısmına / proc / sys / kernel / {ostype, hostname, osrelease, sürüm, domainname} üzerinden de erişilebilir.

Utsname bilgisinin bir kısmına / proc / sys / kernel / {ostype, hostname, osrelease, sürüm, domainname} üzerinden de erişilebilir.

/procAncak dosya sistemi sanaldır; yani yalnızca işletim sistemi çalışırken var olur. Böylece bir kısmı için çekirdek veya sistem kütüphaneleri içine yerleştirilir.

Son olarak, kaynak kodu boyunca okuma uname.cile elde edilebilir apt-get source coreutils, bunun gerçekten kullandığı görebilir utsname.hkitaplığı (hattı numaraları ile baskılı):

 19 
 20 #include <config.h>
 21 #include <stdio.h>
 22 #include <sys/types.h>
 23 #include <sys/utsname.h>
 24 #include <getopt.h>
 25 

strace çıktı:

skolodya@ubuntu:$ strace uname -a
execve("/bin/uname", ["uname", "-a"], [/* 58 vars */]) = 0
brk(0)                                  = 0x1478000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efee6935000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=137226, ...}) = 0
mmap(NULL, 137226, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7efee6913000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\37\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1840928, ...}) = 0
mmap(NULL, 3949248, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7efee6350000
mprotect(0x7efee650b000, 2093056, PROT_NONE) = 0
mmap(0x7efee670a000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1ba000) = 0x7efee670a000
mmap(0x7efee6710000, 17088, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7efee6710000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efee6912000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efee6910000
arch_prctl(ARCH_SET_FS, 0x7efee6910740) = 0
mprotect(0x7efee670a000, 16384, PROT_READ) = 0
mprotect(0x606000, 4096, PROT_READ)     = 0
mprotect(0x7efee6937000, 4096, PROT_READ) = 0
munmap(0x7efee6913000, 137226)          = 0
brk(0)                                  = 0x1478000
brk(0x1499000)                          = 0x1499000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=7216688, ...}) = 0
mmap(NULL, 7216688, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7efee5c6e000
close(3)                                = 0
uname({sys="Linux", node="eagle", ...}) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efee6934000
uname({sys="Linux", node="eagle", ...}) = 0
uname({sys="Linux", node="eagle", ...}) = 0
write(1, "Linux eagle 4.1.0-040100rc2-gene"..., 113Linux eagle 4.1.0-040100rc2-generic #201505032335 SMP Mon May 4 03:36:35 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
) = 113
close(1)                                = 0
munmap(0x7efee6934000, 4096)            = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

"uname -i" yi çalıştırdığımda, çıktı "x86_64" olur. "/Usr/include/x86_64-linux-gnu/sys/utsname.h" referansını geçtiğimde, "x86_64" ifadesine başvuran hiçbir şey göremiyorum. "Man 2 uname" ifadesine başvurdum ve utsname bilgisinin bir kısmına "/ proc / sys / kernel / {ostype}, {hostname}, {osrelease}, {version} ve {domainname}" üzerinden başvurulduğunu belirtir. Bu dosyaların hiçbiri "x86_64" belirten bir şey başvuruyor. Başka bir önerin var mı?
Roy Hernandez

@RoyHernandez C'de, tamsayının aldığı boyuta bağlı olarak bir CPU mimarisini belirlemek mümkündür, örneğin - buraya bakın . Bu yüzden uname.cmutlaka bunun için bir kütüphane kullanması gerekmez - elbette, kaynak koduna bakabiliriz.
Sergiy Kolodyazhnyy

Aslında bir kütüphaneye güveniyor. . . machine.h
Sergiy Kolodyazhnyy

machine.hsistem boyunca biber gibi görünüyor. Hangi machine.hdosyaya güveniyor?
Roy Hernandez,

@RoyHernandez machine.hbenim sistemde listelenen tüm /usr/src/linux-headers-3.19.0-33dizinde görünüyor . Şu anda çalışan çekirdeğin sağladığı kütüphaneyi kullanması çok muhtemeldir
Sergiy Kolodyazhnyy

6

Elbette heemayl'ın cevabı doğrudur.

Sadece eğlence için, işte döndürülen verileri gösteren bir C parçacığı uname()( unameisterseniz bir ev yapımı ): derleyin ve birlikte gcc uname.c -o unameçalıştırın ./uname:

#include <stdio.h> // printf()
#include <sys/utsname.h> // uname()

int main() {
        int ret; // stores the return value of uname()
        struct utsname utsname; // stores the data returned by uname()
        struct utsname *utsname_ptr = &utsname; // pointer to the struct holding the data returned by uname()

        ret = uname(utsname_ptr); // calls uname() on utsname_ptr and stores its return value in ret

        /* prints the fields of utsname */

        printf("%s\n", utsname.sysname);
        printf("%s\n", utsname.nodename);
        printf("%s\n", utsname.release);
        printf("%s\n", utsname.version);
        printf("%s\n", utsname.machine);

        /* returns the return value of uname() */

        return(ret);
}
% ./uname 
Linux
user-X550CL
4.2.0-25-generic
#30-Ubuntu SMP Mon Jan 18 12:31:50 UTC 2016
x86_64

nerede olduğu printf("%\n", utsname.machine);gelen 's bilgi çekerek?
Roy Hernandez

@RoyHernandez utsnameÇağrı sırasında doldurulan yapıdan uname(). Örnek, muhtemelen C temelleri olmayan birisine göre basit değildir, ancak işte az ya da çok ne olur: struct(içinde tanımlanmış tip) utsnameadında bir tür (C veri türü) bildirilir; Sonra adlı buna bir işaretçi (çünkü bildirilmiş bir işaretçi kabul Çeşidi bu bu durumda önlenebilirdi olsa bir argüman olarak, ama bu başka bir hikaye). utsname<sys/utsname.h>utsname_ptruname()structutsname
kos

Daha sonra yapılan çağrı , çağrı sırasında çeşitli alanların içindeki çeşitli değerleri içeren uname()yapıyı doldurma etkisine sahiptir . Ne yazık ki, eğer C'ye aşina değilseniz, bu muhtemelen ayrıntılı olarak anlaşılması kolay olmayacak, ancak nokta, daha sonra alanları daha sonra yazdırılacak olan bilerek yapılan bir veri yapısını doldurmasıdır . utsnameprintf()uname()printf()
kos

4

Heemayl cevabı bir ek olarak, olduğu gibi bilgi alabilir unamegelen komuta /proc/version.


/ proc / version "Linux sürüm 3.19.0-47-generic (buildd @ lgw01-19) (gcc sürüm 4.8.2 (Ubuntu 4.8.2-19ubuntu1))" # 53 ~ 14.04.1-Ubuntu SMP Pzr Oca 16 16 : 09: 14 UTC 2016 "ve" uname -i "çıktısı" x86_64 ".
Roy Hernandez
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.