कड़ाई से बोलते हुए, डबल-कांटे का डेमन को बच्चे के रूप में पुन: पालन-पोषण करने से कोई लेना-देना नहीं है init
। बच्चे को फिर से बनाने के लिए आवश्यक है कि माता-पिता को बाहर निकलना चाहिए। यह केवल एक ही कांटा के साथ किया जा सकता है। इसके अलावा, अपने आप से डबल-कांटा करने से डेमॉन प्रक्रिया फिर से नहीं होती है init
; डेमन के माता-पिता को बाहर निकलना चाहिए । दूसरे शब्दों में, माता-पिता हमेशा उचित डेमॉन का उपयोग करते समय बाहर निकलते हैं ताकि डेमन प्रक्रिया फिर से सम्मिलित हो init
।
तो डबल कांटा क्यों? POSIX.1-2008 धारा 11.1.3, " द कंट्रोलिंग टर्मिनल ", का उत्तर है (जोर दिया गया):
एक सत्र के लिए नियंत्रण टर्मिनल सत्र नेता द्वारा कार्यान्वयन-परिभाषित तरीके से आवंटित किया जाता है। यदि एक सत्र के नेता के पास कोई नियंत्रण टर्मिनल नहीं है, और एक टर्मिनल डिवाइस फ़ाइल खोलता है जो पहले से ही सत्र O_NOCTTY
(विकल्प open()
) का उपयोग किए बिना सत्र से जुड़ा नहीं है , तो यह कार्यान्वयन-परिभाषित है कि क्या टर्मिनल सत्र नेता का नियंत्रण टर्मिनल बन जाता है। यदि एक प्रक्रिया जो सत्र के नेता नहीं है , एक टर्मिनल फ़ाइल खोलती है, या O_NOCTTY
विकल्प का उपयोग किया जाता है open()
, तो वह टर्मिनल कॉलिंग प्रक्रिया का नियंत्रक टर्मिनल नहीं बनेगा ।
यह हमें बताता है कि अगर एक डेमन प्रक्रिया कुछ इस तरह से ...
int fd = open("/dev/console", O_RDWR);
... तो डेमॉन प्रक्रिया अपने नियंत्रण टर्मिनल के रूप में अधिग्रहण कर सकती है/dev/console
, यह इस बात पर निर्भर करता है कि डेमन प्रक्रिया एक सत्र नेता है, और सिस्टम कार्यान्वयन पर निर्भर करता है। कार्यक्रम यह गारंटी दे सकता है कि उपरोक्त कॉल एक नियंत्रित टर्मिनल का अधिग्रहण नहीं करेगा यदि कार्यक्रम पहले यह सुनिश्चित करता है कि यह सत्र का नेता नहीं है।
आम तौर पर, एक डेमन को लॉन्च करते समय, अपने कंट्रोलिंग टर्मिनल से डेमॉन को अलग करने के लिए setsid
(कॉल करने के बाद बच्चे की प्रक्रिया से) कहा जाता है fork
। हालांकि, कॉलिंग setsid
का अर्थ यह भी है कि कॉलिंग प्रक्रिया नए सत्र का सत्र नेता होगी, जो इस संभावना को छोड़ देती है कि डेमन एक नियंत्रित टर्मिनल को फिर से प्राप्त कर सकता है। डबल-फोर्क तकनीक यह सुनिश्चित करती है कि डेमॉन प्रक्रिया सत्र का नेता नहीं है, जो तब गारंटी देता है कि open
ऊपर दिए गए उदाहरण के अनुसार कॉल करने के लिए, डेमन प्रक्रिया में नियंत्रण टर्मिनल की पुनः प्राप्ति नहीं होगी।
डबल-फोर्क तकनीक थोड़ा पागल है। यह आवश्यक नहीं हो सकता है यदि आप जानते हैं कि डेमन कभी टर्मिनल डिवाइस फ़ाइल नहीं खोलेगा। इसके अलावा, कुछ प्रणालियों पर यह आवश्यक नहीं हो सकता है, भले ही डेमॉन एक टर्मिनल डिवाइस फ़ाइल खोले, क्योंकि यह व्यवहार कार्यान्वयन-परिभाषित है। हालांकि, एक चीज जो कार्यान्वयन-परिभाषित नहीं है, वह यह है कि केवल एक सत्र का नेता ही नियंत्रण टर्मिनल को आवंटित कर सकता है। यदि कोई प्रक्रिया सत्र नेता नहीं है, तो यह एक नियंत्रित टर्मिनल आवंटित नहीं कर सकता है। इसलिए, यदि आप पागल होना चाहते हैं और निश्चित हैं कि डेमॉन प्रक्रिया अनजाने में एक नियंत्रित टर्मिनल का अधिग्रहण नहीं कर सकती है, भले ही किसी भी कार्यान्वयन-परिभाषित बारीकियों की परवाह किए बिना, तो डबल-फोर्क तकनीक आवश्यक है।