যখন trueপ্রস্থান করে, পাইপের পঠিত পাশ বন্ধ করা হয়, কিন্তু yesলেখার পাশ থেকে লিখতে চেষ্টা করার চলতে থাকে। এই অবস্থাকে "ভাঙা পাইপ" বলা হয় এবং এটি কার্নেলকে SIGPIPEসংকেত প্রেরণ করে yes। যেহেতু yesএই সংকেতটি সম্পর্কে বিশেষ কিছু নেই, তাই এটি হত্যা করা হবে। যদি এটি সিগন্যালটিকে উপেক্ষা করে তবে এর writeকলটি ত্রুটি কোড সহ ব্যর্থ হবে EPIPE। যে প্রোগ্রামগুলি সেগুলি লক্ষ্য করা EPIPEএবং লেখা বন্ধ করার জন্য প্রস্তুত থাকতে হবে বা তারা অসীম লুপে যাবে।
আপনি যদি strace yes | true1 করেন তবে কার্নেলটি উভয় সম্ভাবনার জন্য প্রস্তুত করতে দেখতে পাবেন:
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করবে , যতক্ষণ না সমস্ত লেখক মারা যায়, সুতরাং প্রস্থান করা এটিকে পুরোপুরি ব্যহত করবে না।