“uname”从何处提取信息?
uname -i
从哪里拉出信息?
/etc/
是否存在细节?
/proc/
是否存在细节?
如果是这样,它引用哪个文件来输出这些细节?
uname
使用系统调用uname(2)
来获取它显示的内核相关信息。
概要是:
#include int uname(struct utsname *buf);
其中uname(2)
返回buf
的结构中的信息。 您还可以从/usr/include/"$(arch)"-linux-gnu/sys/utsname.h
读取头文件utsname.h
以深入挖掘。
看看man 2 uname
以获得更多关于此的想法。
程序strace
允许我们查看应用程序可能进行的系统调用。 使用uname -a
很明显,唯一的open
调用将转到系统库,因此从技术上讲, uname
打开以供读取的文件系统上没有文件。 而是使用C库进行系统调用。
正如heemayl正确指出的那样,存在用于检索存储在uname
结构中的信息的sys调用。 这是手册页,建议如下:
这是一个系统调用,操作系统可能知道它的名称,发行版和版本。 。 。 。 。 。 部分utsname信息也可以通过/ proc / sys / ker- nel / {ostype,hostname,osrelease,version,domainname}访问。
部分utsname信息也可以通过/ proc / sys / ker- nel / {ostype,hostname,osrelease,version,domainname}访问。
/proc
filesystem然而是虚拟的,这意味着它仅在OS运行时存在。 因此,在某种程度上,它是在内核或系统库中设置的。
最后,通过apt-get source coreutils
可以获得uname.c
的源代码,我们可以看到它确实使用了utsname.h
库(用行号打印):
19 20 #include 21 #include 22 #include 23 #include 24 #include 25
strace
输出:
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 +++
当然,heemayl的答案是正确的。
只是为了好玩,这里有一个工作的C片段展示uname()
返回的数据uname()
如果你想要的话,这是一种自制的uname
):用gcc uname.c -o uname
编译它并用gcc uname.c -o uname
运行它:
#include // printf() #include // 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
作为heemayl的答案的补充,您可以从/proc/version
获取一些信息,例如uname
命令。