2011-09-25 11 views
7

मैंने fork() और exec*() का उपयोग कर एक प्रोग्राम बनाया है। समस्या यह है कि मैं माता-पिता प्रक्रिया से exec() की सफलता या विफलता निर्धारित नहीं कर सकता क्योंकि यह अलग-अलग बाल प्रक्रिया पर है। मुझे लगता है कि इस राज्य की जांच के लिए सिग्नलिंग का इस्तेमाल किया जा सकता है, लेकिन मुझे इसके बारे में कोई जानकारी नहीं है।सफलता या कांटा/निष्पादन की विफलता निर्धारित करने के लिए मानक दृष्टिकोण (जबकि माता-पिता एक साथ चल रहे हैं)?

  1. यह जांचने के लिए अनुशंसित/मानक/व्यापक रूप से उपयोग किया जाने वाला तरीका क्या है?
  2. और ऐसा करने के दौरान मुझे क्या परेशानी है?

प्रश्न विस्तार से अद्यतन (महत्वपूर्ण विस्तार की चूक के लिए खेद है)

मैं दोनों प्रक्रियाओं को बनाए रखना चाहते चल रहे हैं तो मैं बस बच्चे की प्रक्रिया के बाहर निकलने के लिए इंतजार नहीं कर सकते हैं। दूसरे शब्दों में, मैं बाल प्रक्रिया 'exec सफलता या विफलता के बारे में अधिसूचित होना चाहता हूं।

+0

आप जानते हैं कि आप 'प्रतीक्षापिड' और 'वनोहंग' विकल्प का उपयोग करके अवरुद्ध किए बिना बच्चे की स्थिति से पूछ सकते हैं? आपके सिस्टम के आधार पर आपके पास 'प्रतीक्षा 3' और' प्रतीक्षा 4 'भी हो सकता है जो इस ध्वज को भी समझता है। या क्या आप बच्चे को चलते समय माता-पिता को कुछ सिग्नल करना चाहते हैं (जैसे आईपीसी सेमफोरस के साथ)? – DarkDust

+0

@ डार्कडस्ट मैं दोनों प्रक्रियाओं को चलाना चाहता हूं और मैं बाल प्रक्रिया 'exec' स्थिति को अधिसूचित करना चाहता हूं। (सफलता या विफलता) ओह आपने मेरा प्रश्न साफ़ कर दिया। धन्यवाद :) – Eonil

+1

संभावित डुप्लिकेट [क्या निष्पादन विफल हो सकता है? आगे क्या होता है?] (Http://stackoverflow.com/questions/3703013/what-can-cause-exec-to-fail-what-happens-next) (विशेष रूप से, देखें ["आर" से जवाब] (http://stackoverflow.com/questions/3703013/#3703179)) – Nemo

उत्तर

7

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

एक और दृष्टिकोण अक्सर उपयोग किया जाता है एक पाइप एफडी जोड़ी बनाने के लिए ('पाइप' सिस्कल देखें), और बच्चे को एक अंत (आमतौर पर लिखने का अंत) और दूसरा माता-पिता को पास करें। बच्चा माता-पिता को विशिष्ट त्रुटि कोड भेजने के लिए इसका उपयोग कर सकता है। और यदि कोई डेटा प्राप्त किए बिना पाइप बंद हो जाता है तो माता-पिता समयपूर्व समाप्ति का पता लगा सकते हैं। कुछ नुकसान हैं: सिगिपिप माता-पिता को भेजा जाएगा यदि यह किसी भी सक्रिय लेखकों के साथ एक पाइप पर पढ़ता है, और एक बच्चे की प्रक्रिया में एक एफडी (stdin/stdout/stderr के अलावा) का उपयोग करके कुछ बुरी तरह लिखित बाल प्रक्रियाओं को भ्रमित कर सकता है (हालांकि क्लोज-ऑन-प्रोक इसे ठीक करने में मदद कर सकता है)।

आम तौर पर, मैंने जो कोड को फोर्क बनाने के लिए देखा है + निष्पादन मजबूत बहुत हैकी है।