मैंने एक प्रक्रिया पर एक कांटा और exec() किया है, लेकिन मैं इसे पृष्ठभूमि में चलाने के लिए चाहता हूं। मैं यह कैसे कर सकता हूँ? मैं बस उस पर प्रतीक्षापैड को कॉल करने से बच सकता हूं, लेकिन फिर प्रक्रिया हमेशा के लिए बैठती है, माता-पिता को इसकी स्थिति वापस करने का इंतजार कर रही है। क्या ऐसा करने का कोई और तरीका है?मैं सी में पृष्ठभूमि में एक प्रक्रिया कैसे निष्पादित करूं?
उत्तर
सिचचल पकड़ें और हैंडलर में, प्रतीक्षा करें()।
पॉज़िक्स के कुछ स्वाद (मुझे लगता है * बीएसडी, लेकिन मुझे उस पर उद्धरण न दें), अगर आप सिगचल को अनदेखा करते हैं, तो कर्नेल स्वचालित रूप से ज़ोंबी प्रक्रिया को साफ़ कर देगा (जो आप पीएस में देख रहे हैं)। यह एक अच्छी सुविधा है लेकिन पोर्टेबल नहीं है।
पृष्ठभूमि थ्रेड बनाने के लिए फोर्क और फिर निष्पादित करें। इस साइट पर एक डुप्लिकेट प्रश्न देखें: Can we start a background process using exec() giving & as an argument?
हां, मैंने यह प्रश्न देखा, लेकिन यह अभी भी मेरे मूल प्रश्न का उत्तर नहीं देता है। निश्चित रूप से मैं केवल प्रतीक्षा कॉल से बच सकता हूं, लेकिन फिर प्रक्रिया हमेशा के लिए बैठती है। जब भी मैं ps -al चलाता हूं, मैं इसे देख सकता हूं। –
मुझे नहीं लगता कि पिछले प्रश्न के उत्तर वास्तव में इसका जवाब देते हैं (जैसा आदित्य भी शिकायत करता है); सही उत्तर एवी द्वारा दिया गया था। इसके अलावा, मुझे संदेह है कि पिछले प्रश्न के उत्तर वास्तव में इस पिछले प्रश्न का उत्तर देते हैं (चूंकि ओपी भी पृष्ठभूमि प्रक्रिया बनाना चाहता था, और किसी ने उसे डबल-कांटा के बारे में नहीं बताया)। –
waitpid(-1, &status, WNOHANG)
आपको जो चाहिए वह कर सकता है: यदि कोई बच्चा प्रक्रिया समाप्त नहीं हुई है तो उसे तत्काल वापस जाना चाहिए। वैकल्पिक रूप से, आप SIGCHLD संकेत के लिए सुन सकते हैं।
यह एक अच्छी रणनीति नहीं है - जब तक कि माता-पिता की प्रक्रिया बार-बार ऐसा करने के लिए तैयार नहीं होती है (अन्यथा आप अभी भी ज़ोंबी के साथ समाप्त होते हैं)। –
दुर्भाग्य से मुझे मार्टिन की भविष्यवाणी का नतीजा मिला, लेकिन तब तक यह निश्चित रूप से अच्छा लगा। –
यह सब इस बात पर निर्भर करता है कि मूल प्रक्रिया को कैसे संरचित किया जाता है। कभी-कभी SIGCHLD को पकड़ने के बजाय कभी-कभी मतदान करना आसान होता है। –
मुझे लगता है कि आप जो करने की कोशिश कर रहे हैं वह एक डेमॉन प्रक्रिया बना रहा है। एक व्याख्या के लिए विकिपीडिया पर this लिंक पढ़ें।
एक उदाहरण एक प्रक्रिया एक डेमॉन है बनाने के लिए (यूनिक्स पर्यावरण में स्टीवन के उन्नत प्रोग्रामिंग से):
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int daemon_int(void)
{
pid_t pid;
if ((pid = fork()) < 0)
return (-1) ;
else if (pid != 0)
exit(0) ; /* The parent process exits */
setsid() ; /* become session leader */
chdir("/") ; /* change the working dir */
umask(0) ; /* clear out the file mode creation mask */
return(0) ;
}
बेशक इस ओएस की तरह एक यूनिक्स मान है।
तो आपके प्रोग्राम में उपरोक्त फ़ंक्शन शामिल है और जितनी जल्दी हो सके इसे कॉल करता है। इसके बाद इसे मूल प्रक्रिया से अलग किया जाता है और जब तक यह समाप्त नहीं हो जाता है या यह मारे जाते हैं तब तक चलते रहेंगे।
हम्म सवाल के करीब पढ़ने से मुझे लगता है कि एवी का जवाब हो सकता है। या आप पहले बच्चे को एक डिमन बनने का कारण बन सकते हैं जो ग्रैंडचिल्ड को समाप्त करने की प्रतीक्षा करता है। तो आप माता-पिता और बच्चे के बीच के लिंक को तोड़ते हैं ताकि माता-पिता को बाहर निकलने के लिए बाल और ग्रैंडचिल्ड के बिना समाप्त कर दिया जा सके। – Jackson
यदि आप ऐसा करना चाहते हैं, तो आप अपनी मूल प्रक्रिया को अपने बच्चे को काटने के लिए प्रतीक्षा() को कॉल करना चाहते हैं। चूंकि बाल प्रक्रिया जल्दी से बाहर निकल जाएगी (दादाजी को तोड़ने के ठीक बाद), आपकी मूल प्रक्रिया लंबे समय तक प्रतीक्षा नहीं करेगी()। –
- 1. मैं एक पायथन प्रक्रिया में रिमोट डीबगर कैसे संलग्न करूं?
- 2. ट्रिगर में प्रक्रिया निष्पादित करें
- 3. वसंत वेबपैप में पृष्ठभूमि प्रक्रिया कैसे बनाएं?
- 4. पर्ल में पृष्ठभूमि प्रक्रिया कैसे शुरू करें?
- 5. मैं एसक्यूएल एजेंट नौकरी में संग्रहीत प्रक्रिया को कैसे निष्पादित करूं?
- 6. मैंने एक प्रक्रिया शुरू की है, मैं उस प्रक्रिया में एक विधि कैसे कॉल करूं
- 7. मैं सूची में प्रत्येक कमांड को कैसे निष्पादित करूं?
- 8. मैं वेब एसक्यूएल में एकाधिक कथन कैसे निष्पादित करूं?
- 9. मैं बैश में HTTP PUT निष्पादित कैसे करूं?
- 10. रेल में डीबी कनेक्शन पर मैं क्वेरी कैसे निष्पादित करूं?
- 11. मैं एक PHP स्क्रिप्ट पृष्ठभूमि
- 12. मैं सी # में एक खुले बंदरगाह का प्रक्रिया नाम कैसे प्राप्त करूं?
- 13. PHP; पृष्ठभूमि में प्रक्रिया शुरू करें
- 14. मैं सी ++ में कॉलबैक कैसे कार्यान्वित करूं?
- 15. मैं सी में मेमोरी कैसे मुक्त करूं?
- 16. मैं सी # में% LocalAppData% कैसे प्राप्त करूं?
- 17. पृष्ठभूमि प्रक्रिया
- 18. मैं log4net ADONetAppender में संग्रहीत प्रक्रिया का उपयोग कैसे करूं?
- 19. सर्वाधिक निष्पादित संग्रहीत प्रक्रिया?
- 20. मैं सी # में एक पैनल को बफर कैसे करूं?
- 21. सी में, मैं एक निर्दिष्ट निर्देशिका कैसे प्राप्त करूं?
- 22. मैं उद्देश्य-सी में एक टेक्स्ट फ़ाइल कैसे पार्स करूं?
- 23. मैं लुआ से सी ++ में एक टेबल कैसे पास करूं?
- 24. मैं सी # में एक दोस्ताना यूआरएल कैसे उत्पन्न करूं?
- 25. प्रत्येक बार नोड सहेजे जाने के बाद मैं ड्रूपल में एक क्रिया कैसे निष्पादित करूं?
- 26. मैं वर्तमान प्रक्रिया को कैसे सूड करूं?
- 27. संग्रहीत प्रक्रिया में संग्रहीत प्रक्रिया को निष्पादित करना
- 28. मैं एक SWT ExpandBar की पृष्ठभूमि को कैसे साफ़ करूं?
- 29. मैं सादा सी में धागे कैसे शुरू करूं?
- 30. मैं एक HTML फ्रेम का पृष्ठभूमि रंग कैसे सेट करूं?
यह लागू करने का सबसे साफ समाधान था। धन्यवाद! –
एक ही प्रश्न के साथ भविष्य के प्रोग्रामर के लिए, "यूनिक्स पर्यावरण में उन्नत प्रोग्रामिंग" के पृष्ठ 2 9 3 पर मुझे यह मिला है: SIGCHLD जब भी कोई प्रक्रिया समाप्त हो जाती है या बंद हो जाती है, तो SIGCHLD सिग्नल माता-पिता को भेजा जाता है। डिफ़ॉल्ट रूप से, इस सिग्नल को अनदेखा किया जाता है, इसलिए माता-पिता को इस सिग्नल को पकड़ना चाहिए यदि वह किसी बच्चे की स्थिति में बदलाव होने पर अधिसूचित होना चाहता है। सिग्नल-कैचिंग फ़ंक्शन में सामान्य कार्रवाई बच्चे की प्रक्रिया आईडी और समाप्ति स्थिति लाने के लिए प्रतीक्षा कार्यों में से एक को कॉल करना है। इस मामले में, मुझे बस एक लाइन की आवश्यकता है जैसे liw.fi ने सुझाव दिया: प्रतीक्षापिड (-1, और स्थिति, WNOHANG | WUNTRACED); –