2012-09-04 17 views
5

मैंने पहले प्रश्न Differences between fork and exec को पढ़ा लेकिन यह मुझे कुछ संदेहों के साथ छोड़ दिया।कांटा(), exec और waitpid()

fork() का उपयोग करते समय और आप बच्चे पर निष्पादन कहते हैं, exec द्वारा बनाई गई नई प्रक्रिया अभी भी एक बच्चा है?

क्या माता-पिता की प्रक्रिया को मारना बच्चे को भी मारता है?

ड्राइंग/उदाहरण में the top answer में दिखाया गया है, वह wait/waitpid कॉल करता है, तो माता-पिता की प्रक्रिया पहले समाप्त हो जाता है, बच्चे प्रक्रिया मर जाता है और फिर आप आंशिक या ls आदेश के लिए कोई उत्पादन क्योंकि, यह सही है?

+0

आह, मैं एचयूपी के बारे में सोच रहा था। –

उत्तर

2

पैरेंट प्रक्रिया को मारना बच्चे को मारता नहीं है। जब बच्चे की प्रक्रिया exec फ़ंक्शन पर कॉल करती है, तो यह अभी भी एक बाल प्रक्रिया है।

लिंक किए गए प्रश्न के उदाहरण में, फ्लोचार्ट मोटे तौर पर उस प्रक्रिया का वर्णन कर रहा है जो एक खोल कमांड का आह्वान करने के लिए उपयोग करता है। जब तक आदेश बैक-ग्राउंड नहीं होता है, तो खोल - मूल प्रक्रिया - आदेशों को पढ़ने के पहले जारी होने तक बच्चे की प्रक्रिया समाप्त होने तक प्रतीक्षा करेगी। अन्यथा बच्चे पर इंतजार करना जरूरी नहीं होगा।

this question भी देखें।

3

exec वर्तमान में निष्पादन प्रक्रिया छवि को एक नए के साथ बदल देता है। तो हाँ, बच्चा एक बच्चा प्रक्रिया है (यह वास्तव में एक ही प्रक्रिया है।)

नहीं, माता-पिता को मारना बच्चे को मारता नहीं है (बच्चा orphaned है)।

2

फोर्क() का उपयोग करते समय और आप बच्चे पर निष्पादन कहते हैं, नई प्रक्रिया निष्पादन द्वारा बनाई गई अभी भी एक बच्चा सही है?

जब बच्चा नई प्रक्रिया बच्चे द्वारा नियंत्रित किया जाता पर कार्यकारी बुला। बच्चे की प्रक्रिया को निष्पादन कॉल द्वारा प्रतिस्थापित किया जाता है।

क्या माता-पिता की प्रक्रिया को मारने से बच्चे को भी मार दिया जाता है?

ओएस होने पर माता-पिता की प्रक्रिया मरने पर बच्चे की प्रक्रिया मरने के लिए संभव है (कम से कम लिनक्स में) ओएस को सिग्नल भेजकर, लेकिन अन्यथा यह बस रहता है।

वह प्रतीक्षा/waitpid कॉल करता है, तो माता-पिता की प्रक्रिया पहले समाप्त हो जाता है, बच्चे प्रक्रिया मर जाता है और फिर आप आंशिक या ls कमांड के लिए कोई उत्पादन क्योंकि, यह सही है?

आप बच्चे प्रक्रिया के लिए इंतजार करना चाहते हैं (उदाहरण के रूप में आप की ओर इशारा) ताकि: क) आप सही तरीके से अपने बच्चे की प्रक्रिया समाप्त होने ख समाप्त कर सकते हैं) बच्चे प्रक्रिया सभी की पहुंच है माता-पिता के संसाधन ... जिसका अर्थ है कि अगर आपके बच्चे के पास माता-पिता द्वारा खोला गया फ़ाइल हैंडल है और माता-पिता बाहर निकलते हैं, लेकिन बच्चा मानता है कि फ़ाइल तब तक खुल जाएगी जब तक यह चल रहा है, बुरी चीजें घटित होंगी।

इस त्वरित उदाहरण पर एक नज़र डालें:

void main() 
{ 
    if(fork()){ 
     printf("parent print"); 
    } 
    else 
     while(1); 
    printf("done"); 
} 

यहाँ आप होगा:

[email protected]:~> ps 
PID TTY   TIME CMD 
18577 pts/2 00:00:00 bash 
18643 pts/2 00:00:00 ps 

तो इस छोटे से कार्यक्रम चलाने: सबसे पहले, एक प्रक्रिया सूची के उत्पादन को देखो अभिभावक संदेश "मूल प्रिंट" प्रिंट करें फिर "किया"। एक "ps" सूची की जाँच करें इसके पूर्ण हो जाने और आप मौज-पेड़ में एक नई प्रक्रिया देखेंगे:

[email protected]:~> ps 
PID TTY   TIME CMD 
18577 pts/2 00:00:00 bash 
18673 pts/2 00:00:02 a.out 
18678 pts/2 00:00:00 ps 

a.out, बच्चा है कि जबकि पाश में हमेशा के लिए बैठे, जबकि माता-पिता समाप्त हो गया।

+1

"बच्चे पर निष्पादन करते समय बच्चे द्वारा नई प्रक्रिया को संभाला जाता है। बच्चे की प्रक्रिया को निष्पादन कॉल द्वारा प्रतिस्थापित किया जाता है और फिर इसे पूरा होने पर वापस रखा जाता है। "नहीं: 'exec' को कॉल करना एक नई प्रक्रिया नहीं बनाता है। यह अभी भी एक ही बाल प्रक्रिया है। प्रक्रिया के कोड और डेटा को प्रतिस्थापित करने के लिए 'निष्पादन' क्या होता है। मुझे नहीं पता कि "यह कब किया जाता है" द्वारा मेरा मतलब क्या है, मैं इस विवरण को फिट करने वाले किसी भी चीज़ के बारे में नहीं सोच सकता। – Gilles

+0

@Gilles क्या यह मदद संपादित करता है? – Mike

+0

नहीं: क्या आप "मूल निष्पादन पथ" का जिक्र कर रहे हैं? जब क्या किया जाता है? – Gilles

2
.. the new process created by exec is still a child right? 

हाँ, यह अभी भी बच्चा है।

Does killing the parent process kills the child too? 

नहीं। माता-पिता जो भी कारण और बच्चे अभी भी निष्पादित कर रहा है के लिए मर जाता है, तो बच्चे init process (प्रक्रिया ID = 1) प्रक्रिया है जो इस orphan process के नए माता-पिता बन जाएगा द्वारा अपनाया हो जाएगा।

calls wait/waitpid because if the parent process terminates first, the child... 

waitpid/wait माता-पिता के लिए बच्चे की स्थिति को अधिसूचित करने के लिए है। ध्यान दें कि, यदि माता-पिता की प्रक्रिया में कई बच्चे हैं तो यह आमतौर पर किसी भी बच्चे के लिए प्रतीक्षा करता है जब तक कि आप किसी विशेष बच्चे की प्रक्रिया आईडी निर्दिष्ट न करें।

+1

प्लस अंक :) – user1644340

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