কোথা uname -iথেকে তথ্য টানছে?
বিশদে কি আছে /etc/?
বিশদে কি আছে /proc/?
যদি তাই হয় তবে কোন ফাইলটি সেই বিবরণগুলি আউটপুট দেওয়ার জন্য উল্লেখ করছে?
কোথা uname -iথেকে তথ্য টানছে?
বিশদে কি আছে /etc/?
বিশদে কি আছে /proc/?
যদি তাই হয় তবে কোন ফাইলটি সেই বিবরণগুলি আউটপুট দেওয়ার জন্য উল্লেখ করছে?
উত্তর:
unameuname(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পড়ার জন্য প্রর্দশিত হবে। বরং এটি সি লাইব্রেরি ব্যবহার করে সিস্টেম কল করে।
হিমাইল যথাযথভাবে ইঙ্গিত করার সাথে unameকাঠামোতে সঞ্চিত তথ্য পুনরুদ্ধার করার জন্য সাইস কল রয়েছে । এটি ম্যান পৃষ্ঠা, নীচের পরামর্শ দেয়:
এটি একটি সিস্টেম কল এবং অপারেটিং সিস্টেমটি সম্ভবত এর নাম, প্রকাশ এবং সংস্করণ জানে। । । । । । Utsname তথ্যের অংশটি / proc / sys / ker‐el / nost ostype, হোস্টনাম, অস্রেলিজ, সংস্করণ, ডোমেননাম via এর মাধ্যমেও অ্যাক্সেসযোগ্য}
Utsname তথ্যের অংশটি / proc / sys / ker‐el / nost ostype, হোস্টনাম, অস্রেলিজ, সংস্করণ, ডোমেননাম via এর মাধ্যমেও অ্যাক্সেসযোগ্য}
/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সিস্টেম জুড়ে peppered বলে মনে হচ্ছে। এটি কোন machine.hফাইলের উপর নির্ভর করে?
machine.hআমার সিস্টেমের তালিকাভুক্ত সমস্ত রয় হার্নান্দেজ /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।