को संभालने वाली प्रणाली में लिनक्स 2.6.35+ चलने वाली प्रणाली में मेरा प्रोग्राम कई बाल प्रक्रियाएं बनाता है और उन्हें मॉनीटर करता है। यदि कोई बच्चा प्रक्रिया मर जाती है तो मैं कुछ साफ-सफाई करता हूं और प्रक्रिया को फिर से उत्पन्न करता हूं। मैं अपनी प्रक्रिया में SIGCHLD
संकेत प्राप्त करने के लिए signalfd()
का उपयोग करता हूं। signalfd
libevent
का उपयोग करके असीमित रूप से उपयोग किया जाता है।एकाधिक SIGCHLD
गैर-वास्तविक समय सिग्नल के लिए सिग्नल हैंडलर का उपयोग करते समय, सिग्नल हैंडलर किसी विशेष सिग्नल के लिए चल रहा है, उसी सिग्नल की आगे होने वाली घटना को रिकर्सिव हैंडलर में आने से बचने के लिए अवरुद्ध किया जाना चाहिए। यदि उस समय एकाधिक सिग्नल आते हैं तो कर्नेल केवल एक बार हैंडलर को आमंत्रित करता है (जब सिग्नल अनब्लॉक किया जाता है)।
क्या यह signalfd()
का उपयोग करते समय भी वही व्यवहार है? चूंकि signalfd
आधारित हैंडलिंग में सामान्य सिग्नल हैंडलर के एसिंक्रोनस निष्पादन से जुड़ी सामान्य समस्याएं नहीं हैं, मैं सोच रहा था कि कर्नेल कतारSIGCHLD
की सभी और घटनाएं कर सकता है?
किसी को भी इस मामले में लिनक्स व्यवहार स्पष्ट कर सकता हूँ ...
धन्यवाद .. प्रश्नों के दो जोड़े ..
आइए कहें कि एपोल कतार में कई घटनाएं हैं जो अभी तक मेरी प्रक्रिया से निकली नहीं हैं। उस स्थिति में आप कह रहे हैं कि एन प्रक्रियाओं में मरने के बावजूद कर्नेल सिग्नल पर सिग्नल के लिए केवल एक पठन घटना कतार करेगा? लूप में वेटपिड() का उपयोग करने के बारे में, इस दृष्टिकोण के साथ मेरी समस्या यह है कि आपको केवल बाल प्रक्रिया की निकास स्थिति मिलती है, लेकिन जब आप साइनफ्रेड से पढ़ते हैं तो आपको सिग्नल सिग्नल_सिगिनोफ़ो से प्राप्त अन्य जानकारी खो दी जाती है (या siginfo_t का उपयोग करते समय sigaction)। मुझे लगता है कि इसे पाने का कोई रास्ता नहीं है? – Manohar
@ संतोष ने ध्यान दिया कि एपोल फ़ाइल वर्णक घटनाओं को इसकी शाब्दिक अर्थ में कतार नहीं देता है; बल्कि, यह केवल फाइल डिस्क्रिप्टर (पठनीयता, उत्तरदायित्व) की स्थिति की रिपोर्ट करता है। इसलिए जब एक फ़ाइल डिस्क्रिप्टर पर घटनाएं होती हैं जो इसे पठनीय बनाती हैं, इससे कोई फ़र्क नहीं पड़ता कि कितने हैं - एपोल केवल पठनीयता की रिपोर्ट करेगा।और अगली बार जब आप एक epoll_wait() करते हैं, तो यह वही करेगा (सिवाय इसके कि यदि आप एज-ट्रिगर एपोल का उपयोग करते हैं - लेकिन यह अभी भी घटनाओं की संख्या की रिपोर्ट नहीं करेगा)। संरचना signalfd_siginfo के बारे में, मेरा मानना है कि आप सही हैं। लेकिन सिग्चाल्ड के मामले में आपको वैसे भी क्या चाहिए? –
@ संतोष: यह भी ध्यान दें कि साइनफल्ड() स्वयं सिगचल सिग्नल को संपीड़ित करता है, न कि एपोल। इसका मतलब यह नहीं है कि न केवल आपको एपोल से कई कार्यक्रम मिलेंगे, लेकिन आपको केवल पढ़ने के लिए एक सिग्चल सिग्नल मिलेगा(); दूसरों के स्ट्रक्चर signalfd_siginfo हमेशा के लिए खो जाएगा। –