ন্যূনতম চলমান উদাহরণ
যদি কোনও ধারণা পরিষ্কার না হয় তবে একটি সহজ উদাহরণ রয়েছে যা আপনি দেখেন নি যে এটি ব্যাখ্যা করে।
এই ক্ষেত্রে, সেই উদাহরণটি হ'ল লিনাক্স x86_64 অ্যাসেম্বলি ফ্রিস্ট্যান্ডিং (কোনও libc নয়) হ্যালো ওয়ার্ল্ড:
hello.s
.text
.global _start
_start:
/* write */
mov $1, %rax /* syscall number */
mov $1, %rdi /* stdout */
mov $msg, %rsi /* buffer */
mov $len, %rdx /* buffer len */
syscall
/* exit */
mov $60, %rax /* exit status */
mov $0, %rdi /* syscall number */
syscall
msg:
.ascii "hello\n"
len = . - msg
গিটহাব উজানের দিকে ।
একত্রিত হয়ে চালান:
as -o hello.o hello.S
ld -o hello.out hello.o
./hello.out
প্রত্যাশিত ফলাফল:
hello
এখন সেই উদাহরণটিতে স্ট্রেস ব্যবহার করা যাক:
env -i ASDF=qwer strace -o strace.log -s999 -v ./hello.out arg0 arg1
cat strace.log
আমরা ব্যাবহার করি:
strace.log এখন রয়েছে:
execve("./hello.out", ["./hello.out", "arg0", "arg1"], ["ASDF=qwer"]) = 0
write(1, "hello\n", 6) = 6
exit(0) = ?
+++ exited with 0 +++
যেমন একটি ন্যূনতম উদাহরণ সহ, আউটপুট প্রতিটি একক অক্ষর স্ব স্পষ্ট:
execveলাইন: সিআইএল আর্গুমেন্ট এবং ডকুমেন্ট হিসাবে পরিবেশ সহ কীভাবে straceকার্যকর করা হয় তা দেখায়hello.outman execve
writeলাইন: আমাদের করা রাইট সিস্টেম কলটি দেখায়। 6স্ট্রিংয়ের দৈর্ঘ্য "hello\n"।
= 6সিস্টেম কলের রিটার্ন মান, যা নথি হিসাবে man 2 writeলিখিত বাইট সংখ্যা।
exitলাইন: আমাদের করা প্রস্থান সিস্টেম কলটি দেখায়। কোনও রিটার্নের মান নেই, যেহেতু প্রোগ্রামটি বন্ধ!
আরও জটিল উদাহরণ
স্ট্রেসের অ্যাপ্লিকেশনটি অবশ্যই দেখার জন্য যে কোন সিস্টেম কল করে যে জটিল প্রোগ্রামগুলি আসলে আপনার প্রোগ্রামটি ডিবাগ / অপ্টিমাইজ করতে সহায়তা করে।
উল্লেখযোগ্যভাবে, বেশিরভাগ সিস্টেমে কলগুলি যে আপনি লিনাক্সে মুখোমুখি হতে পারেন সম্ভবত গলিবিক মোড়ক রয়েছে, তাদের বেশিরভাগই পসিক্স থেকে ।
অভ্যন্তরীণভাবে, গ্লিবিক মোড়কাগুলি কমবেশি এর মতো ইনলাইন সমাবেশ ব্যবহার করে: ইনলাইন অ্যাসেমব্লিতে সিন্যাসারের মাধ্যমে কীভাবে একটি সিস্টেম কল শুরু করা যায়?
আপনার পরবর্তী উদাহরণটি পড়া উচিত একটি পসিক্স writeহ্যালো ওয়ার্ল্ড:
main.c
#define _XOPEN_SOURCE 700
#include <unistd.h>
int main(void) {
char *msg = "hello\n";
write(1, msg, 6);
return 0;
}
সংকলন এবং চালান:
gcc -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out
এবার আপনি দেখতে পাবেন যে mainমূল জন্য একটি সুন্দর পরিবেশ সেটআপ করার আগে গ্লিবসি দ্বারা প্রচুর সিস্টেম কল করা হচ্ছে ।
এর কারণ এটি হ'ল আমরা এখন একটি ফ্রিস্ট্যান্ডিং প্রোগ্রাম ব্যবহার করছি না, বরং আরও একটি সাধারণ গ্লিবসি প্রোগ্রাম যা লিবিসি কার্যকারিতার জন্য অনুমতি দেয়।
তারপরে, প্রতিটি প্রান্তে strace.logরয়েছে:
write(1, "hello\n", 6) = 6
exit_group(0) = ?
+++ exited with 0 +++
সুতরাং আমরা উপসংহারে writeপৌঁছেছি যে পসিক্স ফাংশন লিনাক্স writeসিস্টেম কল ব্যবহার করে, অবাক করে!
আমরা এটিও পর্যবেক্ষণ করি যা পরিবর্তে return 0একটি exit_groupকল বাড়ে exit। হা, আমি এই সম্পর্কে জানতাম না! এই কারণেই straceদুর্দান্ত। man exit_groupতারপরে ব্যাখ্যা করুন:
এই সিস্টেম কলটি কলিং থ্রেডটিই নয়, কলিং প্রসেসের থ্রেড গ্রুপের সমস্ত থ্রেডকে সমাপ্ত করে ব্যতীত (2) প্রস্থান করার সমতুল্য।
এবং এখানে আরও একটি উদাহরণ রয়েছে যেখানে আমি অধ্যয়ন করেছি কোন সিস্টেমে কল dlopenব্যবহার করে: /unix/226524/ কি- সিস্টেমে-call-is-used-to-load-libraries-in-linux / 462710#462710
উবুন্টু 16.04, জিসিসি 6.4.0, লিনাক্স কার্নেল 4.4.0 এ পরীক্ষিত।