2011-12-06 7 views
13

को संभालने वाली प्रणाली में लिनक्स 2.6.35+ चलने वाली प्रणाली में मेरा प्रोग्राम कई बाल प्रक्रियाएं बनाता है और उन्हें मॉनीटर करता है। यदि कोई बच्चा प्रक्रिया मर जाती है तो मैं कुछ साफ-सफाई करता हूं और प्रक्रिया को फिर से उत्पन्न करता हूं। मैं अपनी प्रक्रिया में SIGCHLD संकेत प्राप्त करने के लिए signalfd() का उपयोग करता हूं। signalfdlibevent का उपयोग करके असीमित रूप से उपयोग किया जाता है।एकाधिक SIGCHLD

गैर-वास्तविक समय सिग्नल के लिए सिग्नल हैंडलर का उपयोग करते समय, सिग्नल हैंडलर किसी विशेष सिग्नल के लिए चल रहा है, उसी सिग्नल की आगे होने वाली घटना को रिकर्सिव हैंडलर में आने से बचने के लिए अवरुद्ध किया जाना चाहिए। यदि उस समय एकाधिक सिग्नल आते हैं तो कर्नेल केवल एक बार हैंडलर को आमंत्रित करता है (जब सिग्नल अनब्लॉक किया जाता है)।

क्या यह signalfd() का उपयोग करते समय भी वही व्यवहार है? चूंकि signalfd आधारित हैंडलिंग में सामान्य सिग्नल हैंडलर के एसिंक्रोनस निष्पादन से जुड़ी सामान्य समस्याएं नहीं हैं, मैं सोच रहा था कि कर्नेल कतारSIGCHLD की सभी और घटनाएं कर सकता है?

किसी को भी इस मामले में लिनक्स व्यवहार स्पष्ट कर सकता हूँ ...

उत्तर

17

लिनक्स पर एक साथ कई बच्चों से पहले आप पढ़ सकते हैं signalfd() के साथ एक SIGCHLD एक भी SIGCHLD में संकुचित हो जाएगा समाप्त। इसका मतलब यह है कि जब आप SIGCHLD संकेत पढ़ा है, आप सभी बच्चों कि समाप्त हो जाने के बाद साफ करने के लिए है:

// Do this after you've read() a SIGCHLD from the signalfd file descriptor: 
while (1) { 
    int status; 
    pid_t pid = waitpid(-1, &status, WNOHANG); 
    if (pid <= 0) { 
     break; 
    } 
    // something happened with child 'pid', do something about it... 
    // Details are in 'status', see waitpid() manpage 
} 

मैं नोट करना चाहिए कि मैं वास्तव में इस संकेत संपीड़न देखा है जब दो बच्चे पर समाप्त संसाधित उसी समय। अगर मैंने केवल एक ही waitpid() किया, तो समाप्त होने वाले बच्चों में से एक को संभाला नहीं गया था; और उपरोक्त पाश इसे ठीक कर दिया।

अनुरूप प्रलेखन:

  • http://man7.org/linux/man-pages/man7/signal.7.html"इसके विपरीत, अगर एक मानक संकेत के कई उदाहरण दिया जाता है, जबकि कि सिग्नल वर्तमान में अवरुद्ध है, तो केवल एक उदाहरण कतारबद्ध है"
  • http://man7.org/linux/man-pages/man3/sigwait.3p.html"अगर सिग्वाइट() के लिए कॉल से पहले एक सिग्नल नंबर के कई लंबित उदाहरण हैं, यह कार्यान्वयन-परिभाषित किया गया है कि सफल रिटर्न पर उस सिग्नल नंबर के लिए शेष शेष लंबित सिग्नल हैं। "
+0

धन्यवाद .. प्रश्नों के दो जोड़े ..
आइए कहें कि एपोल कतार में कई घटनाएं हैं जो अभी तक मेरी प्रक्रिया से निकली नहीं हैं। उस स्थिति में आप कह रहे हैं कि एन प्रक्रियाओं में मरने के बावजूद कर्नेल सिग्नल पर सिग्नल के लिए केवल एक पठन घटना कतार करेगा? लूप में वेटपिड() का उपयोग करने के बारे में, इस दृष्टिकोण के साथ मेरी समस्या यह है कि आपको केवल बाल प्रक्रिया की निकास स्थिति मिलती है, लेकिन जब आप साइनफ्रेड से पढ़ते हैं तो आपको सिग्नल सिग्नल_सिगिनोफ़ो से प्राप्त अन्य जानकारी खो दी जाती है (या siginfo_t का उपयोग करते समय sigaction)। मुझे लगता है कि इसे पाने का कोई रास्ता नहीं है? – Manohar

+0

@ संतोष ने ध्यान दिया कि एपोल फ़ाइल वर्णक घटनाओं को इसकी शाब्दिक अर्थ में कतार नहीं देता है; बल्कि, यह केवल फाइल डिस्क्रिप्टर (पठनीयता, उत्तरदायित्व) की स्थिति की रिपोर्ट करता है। इसलिए जब एक फ़ाइल डिस्क्रिप्टर पर घटनाएं होती हैं जो इसे पठनीय बनाती हैं, इससे कोई फ़र्क नहीं पड़ता कि कितने हैं - एपोल केवल पठनीयता की रिपोर्ट करेगा।और अगली बार जब आप एक epoll_wait() करते हैं, तो यह वही करेगा (सिवाय इसके कि यदि आप एज-ट्रिगर एपोल का उपयोग करते हैं - लेकिन यह अभी भी घटनाओं की संख्या की रिपोर्ट नहीं करेगा)। संरचना signalfd_siginfo के बारे में, मेरा मानना ​​है कि आप सही हैं। लेकिन सिग्चाल्ड के मामले में आपको वैसे भी क्या चाहिए? –

+2

@ संतोष: यह भी ध्यान दें कि साइनफल्ड() स्वयं सिगचल सिग्नल को संपीड़ित करता है, न कि एपोल। इसका मतलब यह नहीं है कि न केवल आपको एपोल से कई कार्यक्रम मिलेंगे, लेकिन आपको केवल पढ़ने के लिए एक सिग्चल सिग्नल मिलेगा(); दूसरों के स्ट्रक्चर signalfd_siginfo हमेशा के लिए खो जाएगा। –

0

असल परेशानी से मुक्त रास्ता waitfd कार्यात्मक है कि आप मतदान पर (एक विशिष्ट पीआईडी ​​को जोड़ने के लिए अनुमति होगी)/epoll होगा()। दुर्भाग्यवश, यह प्रस्तावित किए जाने पर लिनक्स साल पहले स्वीकार नहीं किया गया था।

+2

मुझे वास्तव में मतलब था एक टिप्पणी के रूप में इसे एक जवाब के रूप में जोड़ें, क्षमा करें। –

संबंधित मुद्दे