কারণ আপনার প্রোগ্রামটি I / O এর জন্য অপেক্ষা করছে বা অন্যথায় স্থগিত হতে পারে। একটি সিগপাইপ আপনার প্রোগ্রামকে সংবিধানে বাধা দেয়, সিস্টেম কলটি সমাপ্ত করে, এবং তাত্ক্ষণিকভাবে পরিচালনা করা যায়।
হালনাগাদ
একটি পাইপলাইন বিবেচনা করুন A | B | C
।
কেবলমাত্র নির্ধারণের জন্য, আমরা ধরে নেব যে বি হ'ল প্রামাণ্য অনুলিপি:
while((sz = read(STDIN,bufr,BUFSIZE))>=0)
write(STDOUT,bufr,sz);
B
সমাপ্তির সময় থেকে ডেটার জন্য অপেক্ষা করতে পঠিত (2) কলটিতে অবরুদ্ধ । আপনি যদি লিখনের (2) থেকে রিটার্ন কোডের জন্য অপেক্ষা করেন , বি কখন এটি দেখতে পাবে? উত্তরটি অবশ্যই, যতক্ষণ না এ আরও ডেটা লেখেন (তবে এটি দীর্ঘ প্রতীক্ষার কারণ হতে পারে - যদি অন্য কোনও কিছু দ্বারা অবরুদ্ধ থাকে তবে কী হবে?)। লক্ষ্য করুন, যাইহোক, এটি আমাদের আরও সহজ, ক্লিনার প্রোগ্রামেরও অনুমতি দেয়। আপনি যদি লেখার থেকে ত্রুটি কোডের উপর নির্ভর করে থাকেন তবে আপনার এমন কিছু প্রয়োজন হবে:A
C
while((sz = read(STDIN,bufr,BUFSIZE))>=0)
if(write(STDOUT,bufr,sz)<0)
break;
আরেকটি আপডেট
আহা, আপনি লেখার আচরণ সম্পর্কে বিভ্রান্ত হয়ে পড়েছেন। আপনি দেখুন, যখন মুলতুবি লেখার সাথে ফাইল বর্ণনাকারীটি বন্ধ হয়ে যায়, ঠিক তখনই সাইনপাইপ ঘটে। লেখাগুলি শেষ পর্যন্ত -1 ফিরে আসার পরে , সংকেতের পুরো পয়েন্টটি আপনাকে সংকীর্ণভাবে জানানো হয় যে লেখাটি আর সম্ভব নয়। এটি পাইপগুলির পুরো মার্জিত সহ-রুটিন কাঠামোটিকে ইউনিক্সে কাজ করার এক অংশ।
এখন, আমি আপনাকে বেশ কয়েকটি ইউনিক্স সিস্টেম প্রোগ্রামিং বইয়ের একটি সম্পূর্ণ আলোচনার দিকে নির্দেশ করতে পারি, তবে এর থেকে আরও ভাল উত্তর পাওয়া যায়: আপনি নিজে এটি যাচাই করতে পারেন। একটি সাধারণ B
প্রোগ্রাম লিখুন [1] - আপনি ইতিমধ্যে সাহস পেয়ে গেছেন, আপনার যা দরকার তা হ'ল একটি main
এবং এর মধ্যে কিছু রয়েছে - এবং এর জন্য একটি সিগন্যাল হ্যান্ডলার যুক্ত করুন SIGPIPE
। একটি পাইপলাইন চালান
cat | B | more
এবং অন্য একটি টার্মিনাল উইন্ডোতে, বিতে একটি ডিবাগার সংযুক্ত করুন এবং বি সিগন্যাল হ্যান্ডলারের ভিতরে একটি ব্রেকপয়েন্ট রাখুন।
এখন, আরও মারুন এবং বি আপনার সিগন্যাল হ্যান্ডলারের মধ্যে বিরতি দেওয়া উচিত। স্ট্যাক পরীক্ষা করুন। আপনি বুঝতে পারবেন, পঠিত এখনও হয় নি। সিগন্যাল হ্যান্ডলারটি এগিয়ে চলুন এবং ফিরে আসুন, এবং লেখার মাধ্যমে ফিরে আসা ফলাফলটি দেখুন - যা পরে -1 হবে।
[1] স্বাভাবিকভাবেই, আপনি আপনার বি প্রোগ্রামটি সিতে লিখবেন :-)
write
।