এখানে গুরুত্বপূর্ণ ব্যাকগ্রাউন্ডটি হ'ল ডিফল্ট সেটআপ হিসাবে স্ট্যান্ডার্ড দ্বারা লাইন বাফারstdout
করা প্রয়োজন ।
এর ফলে \n
আউটপুট ফ্লাশ হয়।
যেহেতু দ্বিতীয় উদাহরণটিতে নতুন লাইন থাকে না, আউটপুটটি ফ্লাশ হয় না এবং fork()
পুরো প্রক্রিয়াটি অনুলিপি করার ফলে এটি stdout
বাফারের অবস্থার অনুলিপি করে ।
এখন, fork()
আপনার উদাহরণগুলিতে এই কলগুলি মোট 8 টি প্রক্রিয়া তৈরি করে - এগুলি সমস্ত stdout
বাফারের অনুলিপি সহ ।
সংজ্ঞা অনুসারে, এই সমস্ত প্রক্রিয়াগুলি কল exit()
থেকে ফিরে আসে main()
এবং সমস্ত সক্রিয় স্টাডিও স্ট্রিমগুলির পরে exit()
কল আসে । এটি অন্তর্ভুক্ত করে এবং ফলস্বরূপ, আপনি একই সামগ্রীটি আটবার দেখতে পান।fflush()
fclose()
stdout
কল fflush()
করার আগে মুলতুবি আউটপুট সহ সমস্ত স্ট্রিমগুলিতে কল করা fork()
বা ফোর্কড চাইল্ডকে স্পষ্টভাবে কল করতে দেওয়া উচিত _exit()
যা কেবল স্টডিও স্ট্রিমগুলি ফ্লাশ না করেই প্রক্রিয়াটি থেকে বেরিয়ে আসে।
দ্রষ্টব্য যে কলিং exec()
স্টডিও বাফারগুলিকে ফ্লাশ করে না, সুতরাং আপনি যদি fork()
কল করার পরে exec()
( কল করার পরে ) কল করেন এবং (যদি এটি ব্যর্থ হয়) কল করেন তবে স্টিডিও বাফারদের যত্ন নেওয়া ঠিক নয় _exit()
।
বিটিডাব্লু: ভুল বাফারিংয়ের কারণ হতে পারে তা বোঝার জন্য, এখানে লিনাক্সের একটি পূর্ববর্তী বাগ যা সম্প্রতি ঠিক করা হয়েছে:
স্ট্যান্ডার্ডটিকে পাইপের মাধ্যমে পুনঃনির্দেশিত stderr
করা হলে লিনাক্সটি এটিকে উপেক্ষা করে stderr
লাইন বার্ফার করে এবং (আরও খারাপ) পুরোপুরি বাফার করে। সুতরাং ইউনিক্সের জন্য লিখিত প্রোগ্রামগুলি লিনাক্সে খুব দেরীতে নতুন লাইন ছাড়াই আউটপুট স্টাফ করে।
নীচে মন্তব্য দেখুন, এটি এখন ঠিক করা হয়েছে বলে মনে হচ্ছে।
এই লিনাক্স সমস্যাটি ঘিরে কাজ করার জন্য আমি এটি করি:
/*
* Linux comes with a broken libc that makes "stderr" buffered even
* though POSIX requires "stderr" to be never "fully buffered".
* As a result, we would get garbled output once our fork()d child
* calls exit(). We work around the Linux bug by calling fflush()
* before fork()ing.
*/
fflush(stderr);
এই কোডটি অন্য প্ল্যাটফর্মগুলিতে ক্ষতি করে না যেহেতু fflush()
কেবল প্রবাহিত স্ট্রিমে কল করা একটি নূপুর।
./prog1 > prog1.out
) বা পাইপ (./prog1 | cat
) এ আউটপুট সহ প্রোগ্রাম 1 চালানোর চেষ্টা করুন । আপনার মনকে ফুটিয়ে তুলতে প্রস্তুত করুন। :-)