आप भरोसा नहीं कर सकते कि भेजे गए हर सिग्नल को वितरित किया जाएगा। उदाहरण के लिए, लिनक्स कर्नेल "SIGCHLD" का सहवास करता है यदि किसी प्रक्रिया को किसी पूर्व चाइल्ड प्रक्रिया से SIGCHLD को संभालने में लंबा समय लगता है।
आपके प्रश्न के एक अन्य भाग का उत्तर देने के लिए, कर्नेल के अंदर सिग्नल "कतारबद्ध" हो जाते हैं यदि कई सिग्नल बहुत कम अंतराल में आते हैं।
आपको सदस्य के sigaction()
साथ सिग्नल हैंडलर सेट करने के लिए उपयोग करना चाहिए , तर्क के सदस्य को ध्यान से सेट करना चाहिए । मुझे लगता है कि इसका मतलब है कम से कम "asynch" संकेतों के सभी मास्किंग। लिनक्स के लिए मैन पेज के अनुसार , आप सिग्नल को संभाले जाने से बच जाएंगे। मुझे लगता है कि आपको सदस्य को SA_SIGINFO में सेट करना चाहिए , लेकिन मुझे याद नहीं है कि मेरे पास यह अंधविश्वास क्यों है। मेरा मानना है कि यह आपकी प्रक्रिया को एक सिग्नल हैंडलर मिलेगा जो बिना किसी दौड़ की स्थिति के साथ सेट होता है, और एक जो अन्य अधिकांश संकेतों से बाधित नहीं होता है।sa_sigaction
siginfo_t
sa_mask
siginfo_t
sigaction()
sa_flags
अपने सिग्नल हैंडलर फ़ंक्शन को बहुत सावधानी से लिखें। मूल रूप से यह संकेत करने के लिए एक वैश्विक चर निर्धारित किया है कि एक संकेत पकड़ा गया, और उस संकेत के लिए वांछित कार्रवाई के साथ बाकी प्रक्रिया सौदा है। इस तरह से कम से कम समय के लिए सिग्नल मास्क किए जाएंगे।
इसके अलावा, आप अपने सिग्नल हैंडलिंग कोड का बहुत अच्छी तरह से परीक्षण करना चाहेंगे। इसे एक छोटी परीक्षण प्रक्रिया में रखें और संभव के रूप में कई SIGUSR1 और SIGUSR2 संकेतों को भेजें, शायद 2 या 3 विशेष उद्देश्य सिग्नल भेजने वाले कार्यक्रमों से। कुछ अन्य संकेतों में भी मिक्स करें, जब आप आश्वस्त हों कि आपका कोड SIGUSR1 और SIGUSR2 को तेजी से और सही तरीके से संभाल सकता है। कठिन डिबगिंग के लिए खुद को तैयार करें।
यदि आप linux और only linux का उपयोग कर रहे हैं, तो आप signalfd()
एक फाइल डिस्क्रिप्टर बनाने के लिए उपयोग करने के बारे में सोच सकते हैं जिसे आप select()
प्राप्त कर सकते हैं या उन संकेतों को प्राप्त करने के लिए मतदान कर सकते हैं। उपयोग signalfd()
करना डिबगिंग को आसान बना सकता है।
signal(2)
सशक्त रूप से बताता है कि आपsigaction(2)
इसके बजाय इस भ्रम से बचते हैं ।