যখন true
প্রস্থান করে, পাইপের পঠিত পাশ বন্ধ করা হয়, কিন্তু yes
লেখার পাশ থেকে লিখতে চেষ্টা করার চলতে থাকে। এই অবস্থাকে "ভাঙা পাইপ" বলা হয় এবং এটি কার্নেলকে SIGPIPE
সংকেত প্রেরণ করে yes
। যেহেতু yes
এই সংকেতটি সম্পর্কে বিশেষ কিছু নেই, তাই এটি হত্যা করা হবে। যদি এটি সিগন্যালটিকে উপেক্ষা করে তবে এর write
কলটি ত্রুটি কোড সহ ব্যর্থ হবে EPIPE
। যে প্রোগ্রামগুলি সেগুলি লক্ষ্য করা EPIPE
এবং লেখা বন্ধ করার জন্য প্রস্তুত থাকতে হবে বা তারা অসীম লুপে যাবে।
আপনি যদি strace yes | true
1 করেন তবে কার্নেলটি উভয় সম্ভাবনার জন্য প্রস্তুত করতে দেখতে পাবেন:
write(1, "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 4096) = -1 EPIPE (Broken pipe)
--- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=17556, si_uid=1000} ---
+++ killed by SIGPIPE +++
strace
ডিবাগার এপিআইয়ের মাধ্যমে ইভেন্টগুলি পর্যবেক্ষণ করছে, যা প্রথমে এটি ত্রুটির সাথে ফিরে আসা সিস্টেম কল এবং তারপরে সংকেত সম্পর্কে বলে। থেকে yes
এর দৃষ্টিকোণ, যদিও, সংকেত প্রথম ঘটবে। (প্রযুক্তিগতভাবে, কার্নেলটি ব্যবহারকারীর স্থানে নিয়ন্ত্রণ ফিরে পাওয়ার পরে সংকেত সরবরাহ করা হয়, তবে আরও কোনও মেশিনের নির্দেশাবলী কার্যকর করার আগে, সুতরাং write
সি লাইব্রেরিতে "র্যাপার" ফাংশনটি সেট errno
করে অ্যাপ্লিকেশনটিতে ফিরে আসার সুযোগ পায় না ।)
1 দুঃখের বিষয়, strace
লিনাক্স-নির্দিষ্ট। বেশিরভাগ আধুনিক ইউনিক্সে কিছু কমান্ড থাকে যা একই রকম কিছু করে, তবে এটির প্রায়শই আলাদা নাম থাকে এটি সম্ভবত সিস্কল আর্গুমেন্টগুলি পুরোপুরি ডিকোড করে না এবং কখনও কখনও এটি কেবল মূলের জন্যই কাজ করে।
yes | tee >(true) >/dev/null
বিটিডব্লিউ, যেমনটি আপনি প্রত্যাশা করেছিলেনtee
তেমনইtrue
করবে , যতক্ষণ না সমস্ত লেখক মারা যায়, সুতরাং প্রস্থান করা এটিকে পুরোপুরি ব্যহত করবে না।