2011-10-04 10 views
10

मैं यूनिक्स डेमॉन बनाने की सोच रहा हूं, और दो विधियां प्रतीत होती हैं। घना है, जो खोजते समय आ रहा है fork(), setsid(), fork() फिर से फोन करने के लिए है, chdir() सुरक्षित कहीं, umask()close()stdin, stdout और stderr सेट और, अंत में,।डेमॉन() और कॉलिंग फोर्क(), setid(), कांटा() इत्यादि कॉल करने के बीच क्या अंतर है?

man daemon चल रहा है, हालांकि, daemon() फ़ंक्शन पर जानकारी लाता है, जो ऊपर जैसा ही सामान करता है। क्या दो दृष्टिकोणों के बीच कोई अंतर है या daemon() केवल एक सुविधा फ़ंक्शन है जो लंबी हवा वाली विधि के समान ही काम करता है? क्या कोई बेहतर है, खासकर एक नौसिखिया सी प्रोग्रामर के लिए?

उत्तर

19

daemon फ़ंक्शन POSIX में परिभाषित नहीं किया गया है, इसलिए इसका कार्यान्वयन (यदि कोई है) विभिन्न प्लेटफ़ॉर्म पर अलग-अलग व्यवहार कर सकता है।

glibc साथ

लिनक्स पर, daemon केवल करता है एक कांटा, वैकल्पिक रूप से chdir रों (लेकिन केवल / के लिए, आप एक पथ निर्दिष्ट नहीं कर सकते), umask स्पर्श नहीं करता, और std* वर्णनकर्ता बंद नहीं होती (यह वैकल्पिक रूप से उन्हें पुन: खोलता है हालांकि /dev/null)। (source)

तो यह मंच पर निर्भर करता है, और कम से कम एक कार्यान्वयन आप क्या करते हैं की तुलना में कम है। यदि आपको जो कुछ भी हो रहा है, उसके लिए आपको चिपकने की ज़रूरत है, या उस प्लेटफॉर्म पर चिपके रहें जहां daemon फ़ंक्शन ठीक उसी तरह करता है)।

+10

फ़ाइल डिस्क्रिप्टर 0, 1 और 2 को छोड़कर '/ dev/null' को खोलना उन्हें बंद करने के लिए बेहतर है, क्योंकि अन्यथा अगली फाइलें आपके डिमन खोलती हैं (लॉग फाइल, सॉकेट, ...) उन फाइल डिस्क्रिप्टर प्राप्त करेंगे - जो आपको काट सकता है, कहते हैं कि जब कुछ पुस्तकालय आप कॉल कर रहे बंद करने नहीं वर्णनकर्ता 0, 1 और 2 पर 'stderr' ... – caf

+0

अच्छा कॉल करने के लिए एक त्रुटि लिखने का फैसला किया। –

1

डेमॉन कॉल घना कांटा प्रक्रिया को सारांशित, और मैं कोई भी क्रियान्वयन जो कुछ भी अधिक करता याद नहीं है।

डेमॉन के बाद से(), एक उच्च स्तरीय अवधारणा है यह निश्चित रूप से नौसिखिया और अनुभवी प्रोग्रामर के लिए पसंद किया जा रहा है।

2

ध्यान दें कि daemon किसी भी मानक के अनुरूप नहीं है। बेहतर उपयोग मानक के अनुरूप कार्य (जैसे fork POSIX से परिभाषित और setsid)।