আপনি বিশ্বাস করতে পারবেন না যে প্রেরিত প্রতিটি সংকেত সরবরাহ করা হবে। উদাহরণস্বরূপ, লিনাক্স কার্নেল "কোয়েলেসস" SIGCHLD যদি একটি প্রক্রিয়া একটি বহিরাগত শিশু প্রক্রিয়া থেকে SIGCHLD পরিচালনা করতে দীর্ঘ সময় নেয়।
আপনার প্রশ্নের অন্য অংশের উত্তর দেওয়ার জন্য, যদি সংখ্যার বিভিন্ন সংকেত খুব কম সময়ের ব্যবধানে আসে তবে সিগন্যালগুলি কার্নেলের ভিতরে "সারিযুক্ত" হয়ে যায়।
sigaction()আপনার sa_sigactionসদস্যের সাথে সিগন্যাল হ্যান্ডলার siginfo_tসেটআপ করার sa_maskজন্য, siginfo_tযুক্তির সদস্যকে সাবধানতার সাথে সেট করার জন্য আপনার ব্যবহার করা উচিত। আমি মনে করি এর অর্থ হ'ল কমপক্ষে "অ্যাসিঞ্চ" সংকেতগুলি সমস্তকেই ছড়িয়ে দেওয়া। লিনাক্সের ম্যান পেজ অনুসারে আপনি sigaction()পরিচালনা করা সংকেতটিও মুখোশ করুন। আমি মনে করি আপনার sa_flagsসদস্যটিকে SA_SIGINFO এ সেট করা উচিত , তবে আমার কেন এই কুসংস্কার আছে তা আমি মনে করতে পারি না। আমি বিশ্বাস করি এটি আপনার প্রক্রিয়াটি এমন একটি সিগন্যাল হ্যান্ডলার পাবেন যা কোনও রেসের শর্ত ছাড়াই স্থির থাকে এবং এমন একটি যা অন্যান্য সংকেতগুলির দ্বারা বাধাগ্রস্ত হয় না।
খুব খুব সাবধানে আপনার সিগন্যাল হ্যান্ডলার ফাংশন লিখুন। মূলত কেবল একটি বৈশ্বিক পরিবর্তনশীল সেট করুন যা একটি সিগন্যাল ধরা পড়েছে এবং সেই সংকেতের জন্য কাঙ্ক্ষিত ক্রিয়াকলাপের বাকী প্রক্রিয়া চুক্তি করে তা নির্ধারণ করুন। সিগন্যালগুলি সেই সময়টিতে কমপক্ষে সময়ের জন্য মুখোশ দেওয়া হবে।
এছাড়াও, আপনি আপনার সিগন্যাল হ্যান্ডলিং কোডটি খুব ভালভাবে পরীক্ষা করতে চাইবেন। এটি একটি ছোট পরীক্ষা প্রক্রিয়াতে রাখুন এবং যথাসম্ভব 2 বা 3 বিশেষ উদ্দেশ্যে সিগন্যাল-প্রেরণকারী প্রোগ্রামগুলি থেকে যতটা সম্ভব سگুসআর 1 এবং সিগুএসআর 2 সংকেত প্রেরণ করুন। আপনার কোডটি SIGUSR1 এবং SIGUSR2 দ্রুত এবং সঠিকভাবে পরিচালনা করতে পারে এমন বিশ্বাসী হওয়ার পরেও কিছু অন্যান্য সিগন্যালের সাথে মিশ্রিত করুন। নিজেকে ডিবাগিংয়ের জন্য প্রস্তুত করুন।
আপনি যদি লিনাক্স এবং কেবল লিনাক্স ব্যবহার করে থাকেন তবে আপনি signalfd()কোনও ফাইল বর্ণনাকারী তৈরি করতে ব্যবহার করার কথা ভাবতে পারেন যা আপনি select()এই সংকেতগুলি পাওয়ার জন্য পোল করতে পারেন। ব্যবহার signalfd()ডিবাগিংকে আরও সহজ করে তুলতে পারে।
signal(2)জোর দিয়ে পরামর্শ দেয় যেsigaction(2)পরিবর্তে ব্যবহার করে আপনি এই বিভ্রান্তি এড়াতে পারেন ।