uname -i
जानकारी कहाँ से खींच रहा है?
क्या विवरण में मौजूद है /etc/
?
क्या विवरण में मौजूद है /proc/
?
यदि हां, तो उन विवरणों को आउटपुट करने के लिए यह कौन सी फाइल है?
uname -i
जानकारी कहाँ से खींच रहा है?
क्या विवरण में मौजूद है /etc/
?
क्या विवरण में मौजूद है /proc/
?
यदि हां, तो उन विवरणों को आउटपुट करने के लिए यह कौन सी फाइल है?
जवाबों:
uname
uname(2)
कर्नेल से संबंधित जानकारी प्राप्त करने के लिए सिस्टम कॉल का उपयोग करता है ।
सारांश है:
#include <sys/utsname.h>
int uname(struct utsname *buf);
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
संरचना में संग्रहीत जानकारी को पुनः प्राप्त करने के लिए sys कॉल मौजूद है । यह मैन पेज है, निम्नलिखित सुझाव देता है:
यह एक सिस्टम कॉल है, और ऑपरेटिंग सिस्टम संभवतः इसका नाम, रिलीज़ और संस्करण जानता है। । । । । । Utsname जानकारी का हिस्सा / proc / sys / kerel nel / {ostype, hostname, osrelease, version, domainname} के माध्यम से भी सुलभ है।
Utsname जानकारी का हिस्सा / proc / sys / kerel nel / {ostype, hostname, osrelease, version, domainname} के माध्यम से भी सुलभ है।
/proc
फाइलसिस्टम हालांकि आभासी है, जिसका अर्थ है कि यह केवल तभी चल रहा है जब ओएस चल रहा हो। इस प्रकार कुछ विस्तार के लिए इसे कर्नेल या सिस्टम लाइब्रेरी में सेट किया गया है।
अंत में, स्रोत कोड के माध्यम से पढ़ना, uname.c
जिसके साथ प्राप्त किया जा सकता है apt-get source coreutils
, हम देख सकते हैं कि यह वास्तव में utsname.h
लाइब्रेरी का उपयोग करता है (लाइन नंबरों के साथ मुद्रित):
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
उत्पादन:
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.c
लिए किसी पुस्तकालय का उपयोग करने की आवश्यकता नहीं है - हम निश्चित रूप से स्रोत कोड को देख सकते हैं।
machine.h
machine.h
पूरे सिस्टम में पेप्पर लगता है। machine.h
यह किस फाइल पर निर्भर करता है?
machine.h
मेरे सिस्टम पर सूचीबद्ध @RoyHernandez /usr/src/linux-headers-3.19.0-33
निर्देशिका में प्रतीत होती है । यह बहुत संभावना है कि यह वर्तमान में चल रहे कर्नेल द्वारा उपलब्ध कराई गई लाइब्रेरी का उपयोग करता है
बेशक हीमायल का जवाब सही है।
बस मज़े के लिए, यहां काम कर रहे सी स्निपेट डेटा को दिखाते हुए लौटाते हैं uname()
( uname
यदि आप चाहें तो एक तरह का होममेड ): इसे संकलित करें gcc uname.c -o uname
और इसके साथ चलाएं ./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
printf("%\n", utsname.machine);
इसकी जानकारी कहाँ से खींच रहा है?
utsname
, जिसे कॉल करने के दौरान आबादी है uname()
। उदाहरण शायद सी मूल बातें के बिना किसी के लिए बहुत सीधा नहीं है, लेकिन यहां कम या ज्यादा क्या होता है: ए struct
(सी डेटा प्रकार) utsname
नाम का प्रकार utsname
(परिभाषित में टाइप <sys/utsname.h>
) घोषित किया जाता है; तब नाम के एक पॉइंटर को utsname_ptr
घोषित किया जाता है (चूंकि uname()
एक पॉइंटर को एक तर्क के रूप में एक struct
प्रकार से स्वीकार करता है utsname
, हालांकि इस मामले में इससे बचा जा सकता था, लेकिन यह एक और कहानी है)।
uname()
में संरचना को आबाद करने का प्रभाव होता है utsname
, जो printf()
कॉल के समय विभिन्न क्षेत्रों के अंदर विभिन्न मूल्यों को समाहित करता है। यदि आप सी से परिचित नहीं हैं, तो शायद यह विस्तार से समझने में आसान नहीं है, लेकिन मुद्दा यह है कि uname()
उद्देश्य पर निर्मित एक डेटा संरचना को पॉप्युलेट करता है, जिसके खेतों को बाद में प्रिंट किया जाता है printf()
।
हेमायल के उत्तर के अतिरिक्त, आप uname
कमांड से कुछ जानकारी प्राप्त कर सकते हैं /proc/version
।