2011-08-23 6 views
6

मैं कांटा और execlp के साथ एक प्रोग्राम की कोशिश कर रहा हूं जहां अभिभावक पता स्थान "ls" कमांड के साथ प्रतिस्थापित किया गया है।फोर्क और एक्सक्लेप

#include<stdio.h> 
main() 
{ 
    int pid,j=10,fd; 
    pid=fork(); 
    if(pid==0) 
    { 
     printf("\nI am the child\n"); 
     execlp("/bin/ls","ls",NULL); 
     printf("\nStill I am the child\n"); 

    } 
    else if (pid > 0) 
    { 
     printf("\n I am the parent\n"); 
     wait(); 
    } 
} 

जब मैं कार्यक्रम बच्चे

printf("\nStill I am the child\n"); 

की अंतिम पंक्ति पर अमल मुद्रित नहीं है। क्यूं कर?

उत्तर

16

exec सफल होने पर पारिवारिक कार्य वापस नहीं आते हैं।

http://pubs.opengroup.org/onlinepubs/009604499/functions/exec.html

कार्यों के कार्यकारी परिवार एक नई प्रक्रिया छवि के साथ मौजूदा प्रक्रिया छवि को बदल जाएगा। नई छवि एक नियमित, निष्पादन योग्य फ़ाइल से बनाई जाएगी जिसे नई प्रक्रिया छवि फ़ाइल कहा जाता है। सफल निष्पादन से कोई वापसी नहीं होगी, क्योंकि कॉलिंग प्रक्रिया छवि नई प्रक्रिया छवि द्वारा ओवरलैड है।

यदि कोई निष्पादन कार्य कॉलिंग प्रक्रिया छवि पर वापस आता है, तो एक त्रुटि हुई है; वापसी मूल्य -1 होगा, और त्रुटि को इंगित करने के लिए errno सेट किया जाएगा।

4

exec फ़ंक्शन केवल आपके आदेश को निष्पादित नहीं करेंगे। वे वास्तव में आपके चयनित निष्पादन योग्य (आपके मामले में /bin/ls) द्वारा प्रक्रिया के निष्पादन संदर्भ को प्रतिस्थापित करेंगे।

दूसरे शब्दों में, चूंकि ls फ़ंक्शन अपनी प्रक्रिया को समाप्त करने से समाप्त होता है (थोरूग 'निकास' या मुख्य कार्य या जो कुछ भी लौटाता है), ls के निष्पादन के अंत में आपके बच्चे की प्रक्रिया को मार दिया जाएगा। समारोह execlp के बाद

if(pid==0) 
    { 
     printf("\nI am the child\n"); 
     execlp("/bin/ls","ls",NULL); 
     printf("\nError: Could not execute function %s\n", "/bin/ls"); 
     _exit(0); //make sure you kill your process, it won't disappear by itself. 
    } 
0

() execlp इसलिए अपने printf() बयान के प्रलेखन के अनुसार निष्पादित हो नहीं है ":

आप वास्तव में उदाहरण के लिए, कुछ त्रुटियाँ मुद्रित करने के लिए इस printf कॉल उपयोग कर सकते हैं फिर भी मैं बच्चा हूं "निष्पादित नहीं होता है ... !!

-3
  1. आप int प्रकार के रूप में प्रक्रिया आईडी ले जा रहे हैं, लेकिन वास्तव में, स्टोर प्रक्रिया आईडी पर आप pid_t
  2. का उपयोग करना चाहिए जब आप कार्यकारी परिवार समारोह बुलाया प्रक्रिया के पूरे पता स्थान बुला प्रक्रिया की जगह का उपयोग करें। तो, अब पिछले printf बयान नहीं वहाँ नई प्रक्रिया में, वास्तव में भी प्रक्रिया की प्रक्रिया आईडी है भी नहीं बदला है
+0

कई अच्छे अंक, लेकिन नई प्रक्रिया में पिड निश्चित रूप से अलग है। साथ ही, निष्पादन केवल प्रक्रिया को प्रतिस्थापित करता है यदि यह सफल होता है, अन्यथा यह निष्पादन कॉल के बाद जारी रहेगा – techdude

1

वजह साफ है: कार्यकारी() फ़ंक्शन केवल वापसी अगर कोई त्रुटि है हुई। उसी के लिए exec() फ़ंक्शंस के मैन पेज देखें।

जब कार्यकारी() फ़ंक्शन कहा जाता है वास्तव में क्या हो रहा है:

execl() एक नई प्रक्रिया पैदा नहीं करता नहीं है - यह संशोधित करता VADS और संबद्ध सामग्री - इसके अलावा, निष्पादन संदर्भ भी संशोधित किया गया है।

  • पुराना निष्पादन संदर्भ अब उपयोग नहीं किया जाता है - एक नया निष्पादन संदर्भ बनाया गया है।
    • एक नया, ताजा संदर्भ नव लोड आवेदन के लिए बनाई गई है और नियंत्रण scheduler- नियोजक को पारित कर दिया है नव उपलब्ध निष्पादन संदर्भ के साथ एक ही बच्चा प्रक्रिया शुरू - इस का उपयोग करते हुए, एक कूद प्रविष्टि के लिए मार डाला जाता है नए एप्लिकेशन का बिंदु, उपयोगकर्ता-स्थान में - नया एप्लिकेशन उसी बच्चे प्रक्रिया में निष्पादन करना शुरू कर देता है।
      • सिस्टम स्टैक के लिए नए एचडब्ल्यू संदर्भ के साथ ओवरराइट किया गया है जो उपयोगकर्ता-स्थान में नए प्रोग्राम के मुख्य() को फिर से शुरू करता है।
    • निष्पादन संदर्भ और में पुराने अनुप्रयोग के कोड/डेटा/ढेर/ढेर को पूरी तरह से नष्ट कर दिया गया है - अब उपलब्ध नहीं है।
    • केवल समय निष्पादित() या execl() उसी प्रक्रिया/कोड पर वापस लौटाएगा जब प्रक्रिया() या execl() वर्तमान प्रक्रिया में लोड करने में विफल रहता है - यानी, केवल समय execv()/execvl() या कॉल का परिवार वापस आ जाएगा जब execv()/execl()/कॉल के परिवार को पूरा करने में त्रुटि है।

नोट: यदि आप त्रुटियों/त्रुटि कोड के लिए कार्यकारी() परिवार सिस्टम कॉल एपीआई के रिटर्न मान मान्य होगा - त्रुटि/त्रुटि कोड के आधार पर, आप वर्तमान प्रक्रिया समाप्त या कुछ समय लग सकता है अन्य कार्रवाई।