c++ - How to handle execvp(...) errors after fork()? -


मैं नियमित रूप से काम करता हूं:

  • कांटा ()
  • Execvp (cmd,) बच्चे में

यदि execvp विफल रहता है क्योंकि कोई सीएमडी नहीं पाया जाता है, तो मैं इस त्रुटि को मूल प्रक्रिया में कैसे देख सकता हूं?

इस प्रयोजन के लिए प्रसिद्ध हो सकता है।

  #include & lt; errno.h & gt; # शामिल करें & lt; fcntl.h & gt; # शामिल करें & lt; stdio.h & gt; #include & lt; string.h & gt; # शामिल करें & lt; sys / wait.h & gt; # शामिल करें & lt; sysexits.h & gt; # शामिल करें & lt; unistd.h & gt; Int main (int argc, char ** argv) {int pipefds [2]; Int count, err; Pid_t बच्चे; अगर (पाइप (पाइपफ़ैड)) {झूठ ("पाइप"); वापसी EX_OSERR; } अगर (एफसीएनटीएल (पाइपफ़ोड [1], एफ_एसईटीएफडी, एफसीएनटीएल (पाइपेफडीएस [1], एफ_जीईटीएफडी) | एफडीसीएलओएक्सईएक्स) () (दर्पण ("एफसीएनटीएल"); वापसी EX_OSERR; } स्विच (child = fork ()) {case -1: perror ("fork"); वापसी EX_OSERR; मामला 0: बंद करें (पाइपफ़ोड [0]); Execvp (argv [1], argv + 1); लिखना (पाइपफ़ोड [1], और गुमनाम, आकार (आंत)); _exit (0); डिफ़ॉल्ट: बंद करें (पाइपफ़ोड [1]); जबकि ((गणना = पढ़ा (पाइपफ़ोड [0], & amp; err, sizeof (errno))) == -1) यदि (errno! = EAGAIN & amp; errno! = EINTR) तोड़; यदि (गणना) {fprintf (stderr, "बच्चे का execvp:% s \ n", strerror (err)); वापसी EX_UNAVAILABLE; } क्लोज़ (पाइपफ़ोड [0]); डालता है ("बच्चे का इंतज़ार ..."); जबकि (रुपीपिड (बच्चा, और गलती, 0) == -1) यदि (गलत नहीं! = EINTR) {दर्पण ("प्रतीक्षापैड"); वापसी EX_SOFTWARE; } अगर (वाईफिक्सिट (गलती)) printf ("बच्चा% d \ n" से निकल गया, WEXITSTATUS (गलती)); अन्यथा यदि (वाईफिग्निअल (गलती)) printf ("बच्चे को% d \ n" द्वारा मारा गया, WTERMSIG (गलती)); } लौट आना; }  

यह एक पूर्ण प्रोग्राम है।

 $ ./a.out foo child's execvp: ऐसा कोई फ़ाइल या निर्देशिका $ (नींद 1 && killall -QUIT नींद और) ; ./a.out नींद 60 बच्चे के लिए इंतजार कर रहा है ... बच्चा 3 $ तक मार डाला है। बच्चे के लिए सही इंतजार ... बच्चे से निकल गया 0 

यह कैसे काम करता है:

< P> एक पाइप बनाएँ, और लिखना एंडपॉइंट बना CLOEXEC : जब एक exec सफलतापूर्वक प्रदर्शन किया जाता है तो यह स्वत: बंद हो जाता है।

exec से यदि यह सफल होता है, तो हमारे पास अब नियंत्रण नहीं है, लेकिन पाइप बंद है। यदि यह विफल रहता है, तो पाइप में विफलता कोड लिखें और बाहर निकलें।

माता-पिता में, अन्य पाइप समापन बिंदु से पढ़ने का प्रयास करें। यदि पढ़ा शून्य लौटाता है, तो पाइप बंद हो जाता है और बच्चे को exec सफलतापूर्वक होना चाहिए। यदि पढ़ा डेटा देता है, तो यह विफलता कोड है जो हमारे बच्चे ने लिखा है।


Comments

Popular posts from this blog

MySql variables and php -

url rewriting - How to implement the returnurl like SO in PHP? -

kernel - How to create a "Block device" in Windows -