प्रतीक्षा करने के लिए क्या होता है () यदि एकाधिक बाल प्रक्रिया एक साथ समाप्त हो जाती है?

मान लें कि मैं कई बाल प्रक्रिया के साथ एक प्रक्रिया बना रहा हूं और मैं मुख्य प्रक्रिया में प्रतीक्षा() को कॉल करता हूं। यदि एक बच्चा समाप्त हो जाता है, तो इसका pid वापस कर दिया जाता है। लेकिन क्या होता है यदि कुछ बच्चे की प्रक्रिया एक साथ समाप्त हो जाती है? कॉल उनमें से एक के साथ वापस आना चाहिए, और एक दूसरी कॉल दूसरे के साथ वापस आना चाहिए, है ना? क्या कोई विशेष आदेश है जिसमें वे वापस आ जाएंगे (शायद निचले पिड वाले बच्चे को प्राथमिकता दी जा सकती है)?

1

1 उत्तर

नहीं।

एसयूएसवी 4 स्पष्ट रूप से अनिर्दिष्ट छोड़ देता है जिसमें ऑर्डर (यदि कोई है) बाल प्रक्रियाओं को एक या कई <कोड> प्रतीक्षा कॉल द्वारा उपयोग किया जाता है। कोई भी "गोपनीय" आदेश भी नहीं है जिस पर आप भरोसा कर सकते हैं, क्योंकि विभिन्न लिनक्स कर्नेल संस्करण अलग-अलग प्रदर्शन करते हैं। (स्रोत: एम। केरिस्क, टीएलपीआई, 26.1.1, पृष्ठ 542)।


कुछ हद तक संबंधित मामूली जानकारी:
You might wonder why you can reliably wait on several child processes that terminate concurrently बिलकुल. If you think about how signals work, you might be inclined to believe that it is perfectly possible to lose child termination signals. Signals, a well-known fact, कतारबद्ध नहीं हैं (except for realtime signals, but SIGCHLD isn't one!). Which means that if you go strictly by the letter of the book, then clearly several children terminating could cause some child termination signals becoming lost!
You can only call wait once at the same time, so you can at most consume one signal synchronously as it is generated, and have a second one made pending before your next call to wait. It appears that there is no way to account for any other signals that are generated in the mean time.

सौभाग्य से, यह मामला नहीं है। बाल प्रक्रियाओं पर प्रतीक्षारत रूप से ठीक काम करता है। हमेशा, 100%। पर क्यों?

कारण सरल है, कर्नेल "धोखाधड़ी" है। यदि प्रतीक्षा में अवरुद्ध होने पर कोई बच्चा प्रक्रिया निकलती है, तो क्या हो रहा है इसके बारे में कोई सवाल नहीं है। सिग्नल तुरंत वितरित किया जाता है, स्थिति की जानकारी भर दी जा रही है, पैरेंट अनब्लॉक, और बाल प्रक्रिया * poof * हो जाती है।
दूसरी तरफ, यदि कोई बच्चा निकल रहा है और माता-पिता किसी प्रतीक्षा कॉल में नहीं है (या यदि माता-पिता है प्रतीक्षा में है एक और बच्चे काटने का आह्वान करें), प्रणाली बाहर निकलने की प्रक्रिया को "ज़ोंबी" में बदल देती है।
अब, जब मूल प्रक्रिया प्रतीक्षा निष्पादित करती है, और कोई ज़ोंबी प्रक्रियाएं होती हैं, तो यह सिग्नल उत्पन्न होने की प्रतीक्षा को अवरुद्ध नहीं करेगा (जो तब भी नहीं हो सकता है जब सभी बच्चे पहले ही निकल चुके हों!) । इसके बजाए, यह सिर्फ ज़ोंबी में से एक काट देगा, सिग्नल का बहाना अभी दिखाया गया था।

2
जोड़ा
लेकिन अगर मैं SIGCHLD के लिए सिग्नल हैंडलर से प्रतीक्षा को कॉल कर रहा हूं तो क्या होगा? यदि दूसरा बच्चा तब भी समाप्त हो जाता है जब मैं सिग्नल को संभालने में सक्षम हूं, तो SIGCHLD अवरुद्ध है, मुझे दूसरे बच्चे के लिए एक और SIGCHLD सिग्नल नहीं मिलेगा, क्या मैंने आपको सही ढंग से समझा है ?
जोड़ा लेखक Guy, स्रोत
दिलचस्प सवाल, हालांकि आप आमतौर पर ऐसी कोई चीज़ नहीं करना चाहेंगे। यह निश्चित रूप से एक हैंडलर से प्रतीक्षा को कॉल करने के लिए सख्ती से कानूनी है, लेकिन यह अनिश्चित काल तक अवरुद्ध हो सकता है जबकि हैंडलर को सामान्य रूप से "जल्द" वापस जाना चाहिए। लेकिन निश्चित रूप से, आपको ऐसा करने की अनुमति है ऐसा करने के लिए, और उम्मीद है कि यह किसी भी तरह से काम करता है। मैं आपको नहीं बता सकता कि इस मामले में क्या होता है, क्षमा करें। मेरा अनुमान है कि ओएस फिर से "धोखा" देगा और बस प्रतीक्षा करें टर्मिनिंग प्रक्रिया काट लें चाहे वास्तविक सिग्नल अवरुद्ध हो या नहीं। अन्यथा <
जोड़ा लेखक Damon, स्रोत