2009-10-24 12 views
11

मैंने एक प्रक्रिया पर एक कांटा और exec() किया है, लेकिन मैं इसे पृष्ठभूमि में चलाने के लिए चाहता हूं। मैं यह कैसे कर सकता हूँ? मैं बस उस पर प्रतीक्षापैड को कॉल करने से बच सकता हूं, लेकिन फिर प्रक्रिया हमेशा के लिए बैठती है, माता-पिता को इसकी स्थिति वापस करने का इंतजार कर रही है। क्या ऐसा करने का कोई और तरीका है?मैं सी में पृष्ठभूमि में एक प्रक्रिया कैसे निष्पादित करूं?

उत्तर

5

सिचचल पकड़ें और हैंडलर में, प्रतीक्षा करें()।

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

+0

यह लागू करने का सबसे साफ समाधान था। धन्यवाद! –

+0

एक ही प्रश्न के साथ भविष्य के प्रोग्रामर के लिए, "यूनिक्स पर्यावरण में उन्नत प्रोग्रामिंग" के पृष्ठ 2 9 3 पर मुझे यह मिला है: SIGCHLD जब भी कोई प्रक्रिया समाप्त हो जाती है या बंद हो जाती है, तो SIGCHLD सिग्नल माता-पिता को भेजा जाता है। डिफ़ॉल्ट रूप से, इस सिग्नल को अनदेखा किया जाता है, इसलिए माता-पिता को इस सिग्नल को पकड़ना चाहिए यदि वह किसी बच्चे की स्थिति में बदलाव होने पर अधिसूचित होना चाहता है। सिग्नल-कैचिंग फ़ंक्शन में सामान्य कार्रवाई बच्चे की प्रक्रिया आईडी और समाप्ति स्थिति लाने के लिए प्रतीक्षा कार्यों में से एक को कॉल करना है। इस मामले में, मुझे बस एक लाइन की आवश्यकता है जैसे liw.fi ने सुझाव दिया: प्रतीक्षापिड (-1, और स्थिति, WNOHANG | WUNTRACED); –

-1

पृष्ठभूमि थ्रेड बनाने के लिए फोर्क और फिर निष्पादित करें। इस साइट पर एक डुप्लिकेट प्रश्न देखें: Can we start a background process using exec() giving & as an argument?

+0

हां, मैंने यह प्रश्न देखा, लेकिन यह अभी भी मेरे मूल प्रश्न का उत्तर नहीं देता है। निश्चित रूप से मैं केवल प्रतीक्षा कॉल से बच सकता हूं, लेकिन फिर प्रक्रिया हमेशा के लिए बैठती है। जब भी मैं ps -al चलाता हूं, मैं इसे देख सकता हूं। –

+0

मुझे नहीं लगता कि पिछले प्रश्न के उत्तर वास्तव में इसका जवाब देते हैं (जैसा आदित्य भी शिकायत करता है); सही उत्तर एवी द्वारा दिया गया था। इसके अलावा, मुझे संदेह है कि पिछले प्रश्न के उत्तर वास्तव में इस पिछले प्रश्न का उत्तर देते हैं (चूंकि ओपी भी पृष्ठभूमि प्रक्रिया बनाना चाहता था, और किसी ने उसे डबल-कांटा के बारे में नहीं बताया)। –

0

waitpid(-1, &status, WNOHANG) आपको जो चाहिए वह कर सकता है: यदि कोई बच्चा प्रक्रिया समाप्त नहीं हुई है तो उसे तत्काल वापस जाना चाहिए। वैकल्पिक रूप से, आप SIGCHLD संकेत के लिए सुन सकते हैं।

+0

यह एक अच्छी रणनीति नहीं है - जब तक कि माता-पिता की प्रक्रिया बार-बार ऐसा करने के लिए तैयार नहीं होती है (अन्यथा आप अभी भी ज़ोंबी के साथ समाप्त होते हैं)। –

+0

दुर्भाग्य से मुझे मार्टिन की भविष्यवाणी का नतीजा मिला, लेकिन तब तक यह निश्चित रूप से अच्छा लगा। –

+0

यह सब इस बात पर निर्भर करता है कि मूल प्रक्रिया को कैसे संरचित किया जाता है। कभी-कभी SIGCHLD को पकड़ने के बजाय कभी-कभी मतदान करना आसान होता है। –

4

मुझे लगता है कि आप जो करने की कोशिश कर रहे हैं वह एक डेमॉन प्रक्रिया बना रहा है। एक व्याख्या के लिए विकिपीडिया पर 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) ; 
} 

बेशक इस ओएस की तरह एक यूनिक्स मान है।

तो आपके प्रोग्राम में उपरोक्त फ़ंक्शन शामिल है और जितनी जल्दी हो सके इसे कॉल करता है। इसके बाद इसे मूल प्रक्रिया से अलग किया जाता है और जब तक यह समाप्त नहीं हो जाता है या यह मारे जाते हैं तब तक चलते रहेंगे।

+0

हम्म सवाल के करीब पढ़ने से मुझे लगता है कि एवी का जवाब हो सकता है। या आप पहले बच्चे को एक डिमन बनने का कारण बन सकते हैं जो ग्रैंडचिल्ड को समाप्त करने की प्रतीक्षा करता है। तो आप माता-पिता और बच्चे के बीच के लिंक को तोड़ते हैं ताकि माता-पिता को बाहर निकलने के लिए बाल और ग्रैंडचिल्ड के बिना समाप्त कर दिया जा सके। – Jackson

+0

यदि आप ऐसा करना चाहते हैं, तो आप अपनी मूल प्रक्रिया को अपने बच्चे को काटने के लिए प्रतीक्षा() को कॉल करना चाहते हैं। चूंकि बाल प्रक्रिया जल्दी से बाहर निकल जाएगी (दादाजी को तोड़ने के ठीक बाद), आपकी मूल प्रक्रिया लंबे समय तक प्रतीक्षा नहीं करेगी()। –

संबंधित मुद्दे