2011-07-16 15 views
10

मैं कांटा> निष्पादन प्रक्रिया का उपयोग कर बहुत से बाल प्रक्रियाएं बनाना चाहता हूं। कई प्रक्रियाएं बहुत तेजी से समाप्त हो रही हैं (दो मिनट से भी कम समय में, कुछ पहले भी)।सी: एक्ज़ेक/कांटा> निष्क्रिय प्रक्रिया

मेरी पहली समस्या मैं अब तक

./spawnbot > logging.txt 
[CTRL+Z] 
bg 1 
disown 

साथ पृष्ठभूमि में अंडे प्रक्रिया डाल तो अच्छा है। अब मुझे स्पॉनबॉट के किसी भी संदेश को और नहीं दिखाई देता है और वे सीधे logging.txt में जाते हैं। हालांकि, जब भी कोई नया बच्चा बनाया जाता है, तो मैं अपने कंसोल में उस बच्चे के बारे में सारी जानकारी फिर से देखता हूं .. अब मैं प्रत्येक बच्चे को अपने स्वयं के पाइप से शुरू करना चाहता था - क्या बच्चों को अपने आउटपुट संदेश पोस्ट करने का कोई बेहतर तरीका नहीं है सांत्वना? क्या मुझे इसे अभी/dev/null पर रीडायरेक्ट करना चाहिए या क्या यह सी में कुछ ध्वज के साथ किया गया है?

दूसरा, सभी बच्चे वास्तव में मारे नहीं जाते हैं। मेरे ps -ef में बहुत सी प्रक्रियाएं हैं I हम इसके बारे में कैसे कर सकते हैं? मैं कैसे

उत्तर

13

पहले अपना दूसरा प्रश्न कैसे करूं! क्योंकि गिरी सोचता है कि आप अभी भी उन से एक वापसी मान प्राप्त करने के लिए चाहते हो सकता है

आपके बच्चे 'ज़ोंबी' मोड में रहना ..

आप अपने बच्चे प्रक्रियाओं से वापसी मान प्राप्त करने के लिए कोई इरादा नहीं है, तो आप स्थापित करना चाहिए SIGCHLD सिग्नल हैंडलर पैरेंट प्रक्रिया में SIG_IGN पर कर्नेल स्वचालित रूप से आपके बच्चों को काट लेता है।

signal(SIGCHLD, SIG_IGN); 

पहला सवाल आपके क्रियान्वयन के एक यह निर्भर करता है ..

लेकिन सामान्य बोल, केवल आपके कांटा() आप close() का उपयोग करना चाहिए 0 और 1 के लिए पुरानी फाइल वर्णनकर्ता बंद करें और उसके dup2() का उपयोग करने के बाद उन्हें अपने वांछित मूल्यों पर सेट करने के लिए .. अभी एक उदाहरण के लिए कोई समय नहीं है, लेकिन उम्मीद है कि यह आपको सही दिशा में धक्का दे ..

13

आपके बच्चे की प्रक्रियाएं मारे जा रही हैं। Defunct processes को zombie processes भी कहा जाता है; लाश मर गए हैं! एक ज़ोंबी प्रक्रिया प्रक्रिया तालिका में प्रवेश के अलावा कुछ भी नहीं है, इसमें कोई कोड या स्मृति नहीं है।

जब कोई प्रक्रिया मर जाती है (_exit पर कॉल करके, या सिग्नल द्वारा मार डाला जाता है), तो इसे अपने माता-पिता द्वारा प्राप्त किया जाना चाहिए। प्रक्रिया तालिका में प्रवेश के अलावा प्रक्रिया द्वारा उपयोग किए जाने वाले प्रत्येक संसाधन गायब हो जाते हैं। माता-पिता को wait या waitpid पर कॉल करना होगा। एक बार माता-पिता को बाल प्रक्रिया की मृत्यु के बारे में अधिसूचित किया गया है, और उसके पास बच्चे की निकास स्थिति को पढ़ने का अवसर मिला है, तो प्रक्रिया तालिका में बच्चे की प्रविष्टि भी गायब हो जाती है: ज़ोंबी काटा जाता है।

यदि आप कभी भी अपने बच्चों की मृत्यु के बारे में अधिसूचित नहीं होना चाहते हैं, तो SIGCHLD सिग्नल को अनदेखा करें; यह कर्नेल को बताता है कि आप अपने बच्चों के भाग्य को जानने में रुचि नहीं रखते हैं और ज़ोंबी स्वचालित रूप से काटा जाएगा।

signal(SIGCHLD, SIG_IGN) 

आप केवल विशेष परिस्थितियों में अपने बच्चों की होने वाली मौतों की सूचना प्राप्त करना चाहते हैं, तो SA_NOCLDWAIT ध्वज के साथ sigaction कहते हैं। जब कोई बच्चा मर जाता है, यदि माता-पिता wait कार्यों में से एक परिवार को निष्पादित कर रहा है, तो उसे बच्चे की मौत की अधिसूचना दी जाएगी और बाहर निकलने की स्थिति बताई जाएगी; अन्यथा बच्चे की निकास की स्थिति को त्याग दिया जाएगा।

struct sigaction sa; 
sa.sa_handler = &my_sigchld_handler; 
sigemptyset(&sa.sa_mask); 
sa.sa_flags = SA_NOCLDWAIT; 
sigaction(SIGCHLD, &sa, NULL); 

उत्पादन के बारे में, अपने बच्चों को माता पिता के रूप में एक ही स्थानों पर लिख जब तक आप स्पष्ट रूप से उन्हें निर्देशित कर दिये गए हैं (close और open, या dup, या अन्य संभावनाओं के एक नंबर के साथ)। आपके बच्चे मानक त्रुटि के लिए डायग्नोस्टिक संदेश प्रिंट कर रहे हैं (यही वह सब है, इसके बाद)।

./spawnbot >logging.txt 2>&1 

इसके अलावा, के बाद से आप टर्मिनल से बच्चों को अलग करना चाहते करने लगते हैं, तो आप शायद यकीन है कि अगर आप टर्मिनल मारने वे एक SIGHUP प्राप्त नहीं होता है बनाना चाहते हैं। तो nohup का उपयोग करें:

nohup ./spawnbot >logging.txt 2>&1 & 
disown 
संबंधित मुद्दे