2012-06-20 14 views
5

मैंने man(3) setsid को आजमाया है, लेकिन यह केवल यह बताता है कि इसका उपयोग कैसे किया जाए, मुझे समझ में नहीं आता कि सेट कब उपयोगी है?सेटिड() उपयोगी कब है, या हमें लिनक्स में प्रक्रियाओं को समूहबद्ध करने की आवश्यकता क्यों है?

उत्तर

8

एक सत्र प्रक्रियाओं का एक सेट है जो एक नियंत्रण टर्मिनल साझा करता है। जब आप एक नया सत्र शुरू करना चाहते हैं तो सेटिड उपयोगी होता है, क्योंकि आपने एक नए टर्मिनल से कनेक्ट होना शुरू कर दिया है - जैसे टर्मिनल एमुलेटर के अंदर खोल शुरू करते समय - या आप एक डिमन चाहते हैं (जिसे आप नहीं चाहते हैं एक नियंत्रण टर्मिनल से जुड़े रहें)।

इन पहलुओं के बारे में मुझे पता है कि सबसे अच्छा स्पष्टीकरण आर। स्टीवंस यूनिक्स पर्यावरण में उन्नत प्रोग्रामिंग है।

-1

यह daemon बनने के हिस्से के रूप में उपयोगी है, यानी टर्मिनल को नियंत्रित करने से प्रक्रिया को डिस्कनेक्ट कर रहा है। daemon(3) भी देखें।

7

Why do we need to group processes? उस स्थिति पर विचार करें जिसमें आप साफ-सफाई बंद करना चाहते हैं, और इसमें आपके बच्चों को संकेत भेजना शामिल है। एक अंतर्निहित दौड़ की स्थिति है: एक सिग्चल प्राप्त नहीं हुआ है, इसलिए आप जानते हैं कि बच्चा अभी भी जीवित है। तो आप एक संकेत भेजते हैं। लेकिन सिग्नल भेजे जाने से पहले बच्चा समाप्त हो जाता है और दूसरी (असंबद्ध) प्रक्रिया शुरू होती है और उसी बच्चे को उसी बच्चे के रूप में प्राप्त किया जाता है जिस पर सिग्नल भेजा गया था। संकेत तब नई, असंबंधित प्रक्रिया में जाता है। ये गलत है। इसलिए, विशिष्ट पिड्स को सिग्नल भेजने के बजाय, आप प्रक्रिया समूह को सिग्नल करते हैं। जब बच्चा मर जाता है और मूल प्रक्रिया के साथ एक नई प्रक्रिया शुरू होती है, तो नई प्रक्रिया प्रक्रिया समूह का हिस्सा नहीं है और ऊपर वर्णित समस्या से बचा जाता है।

+0

मुझे पता है कि यह पुराना है, लेकिन: आपका उत्तर पूरी तरह से सही नहीं है। आमतौर पर बाल प्रक्रियाओं को मारने में कोई दौड़ की स्थिति नहीं होती है, क्योंकि एक बच्चे की प्रक्रिया जो "ज़ोंबी" प्रक्रिया के रूप में घूमती है (और उसके पिड का पुन: उपयोग नहीं किया जाएगा) जब तक आप इसे 'प्रतीक्षा' या 'प्रतीक्षापिप' या कॉल करके इसे काट नहीं देते समान। इस प्रकार यदि आप एक समाप्ति संकेत भेजते हैं और फिर 'प्रतीक्षापिड' भेजते हैं, तो कोई रेस स्थिति नहीं होती है। एकमात्र अपवाद यह है कि आपने सिगचल्ड एक्शन को "अनदेखा" करने के लिए सेट किया है, इस मामले में बाल प्रक्रियाएं 'प्रतीक्षा' करने के लिए कॉल किए बिना मर सकती हैं। – davmac

+0

(इसके अलावा, प्रश्न 'सेटिड' के बारे में है जो सिर्फ एक प्रक्रिया समूह नहीं, _session leader_ बनाता है। AFAIK परमाणु रूप से पूरे सत्र को सिग्नल करने का कोई तरीका नहीं है)। – davmac

+0

@davmac मैं जिस दौड़ की स्थिति का वर्णन कर रहा हूं वह तब होता है जब इस प्रकार की चीज को शैल स्क्रिप्ट में प्रयोग किया जाता है, और स्क्रिप्ट लेखक के पास प्रतीक्षा के समय नियंत्रण के लिए आवश्यक नियंत्रण स्तर नहीं होता है। हालांकि, आप एक उत्कृष्ट बिंदु बनाते हैं। –