2016-05-23 6 views
5

में संभालने का सबसे अच्छा तरीका मेरे पास मूल प्रक्रिया है, जिसे कुछ बच्चों की प्रक्रियाएं बनाना है। मैंने पाया सबसे अच्छा तरीका fork + execl का उपयोग कर रहा है। लेकिन फिर माता-पिता को यह जानने की जरूरत है कि execl कंक्रीट बच्चे विफल रहता है या नहीं, और मुझे नहीं पता कि इसे कैसे कार्यान्वित किया जाए।लिनक्स में बाल प्रक्रिया बनाने और संभावित विफलता

 int pid = fork(); 
     if (pid < 0) { 
      std::cout << "ERROR on fork." << std::endl; 
     } if (pid == 0) { 
      execl("/my/program/full/path", (char *)NULL); 
      exit(1); 
     } 
     else { 
      if (/*child's process execl fails*/) { 
       std::cout << "it failed" << std::endl 
      } else { 
       std::cout << "child born" << std::endl 
      } 
     } 

मुझे लगता है कि इस विचार अच्छा नहीं है:

int status(0); 
sleep(100); 
int res = waitpid(pid, &status, WNOHANG); 
if (res < 0 && errno == 10) { 
    std::cout << "it failed" << std::endl 
} else { 
    std::cout << "child born" << std::endl 
} 

क्योंकि यह आशा है कि बच्चा प्रक्रिया 100 मिलीसेकंड के बाद मर जाएगा अच्छा नहीं है, मुझे पता है कि यह सुनिश्चित करें के लिए के रूप में ही नहीं इच्छा होता है चाहता हूँ।

मुझे यह भी लगता है कि इस तरह के चेक के लिए साझा_मेमरी या विशेष पाइप कनेक्शन का निर्माण मधुमक्खियों के खिलाफ एक तोप है।

इसके लिए सरल समाधान होना चाहिए, कि मुझे अभी तक अभी तक नहीं मिला है।

इसे प्राप्त करने का सबसे अच्छा तरीका क्या है?

+0

बस 'पॉपन' का उपयोग करें और वापसी मूल्य की जांच करें। – Andrew

+0

मान लें कि यह अभी भी जिंदा है, मैं कैसे सुनिश्चित कर सकता हूं कि execl विफल नहीं हुआ? शायद यह असफल रहा, और प्रक्रिया ज़िंदा है क्योंकि यह अभी तक 'बाहर निकलने (1)' निर्देश को पूरा नहीं कर पाया है। – Arkady

+0

क्या आप यह जांचना चाहते हैं कि आपकी प्रक्रिया सफलतापूर्वक * लॉन्च की गई *, या यह * पूर्ण * और * शून्य की स्थिति लौटा *? दोनों काफी अलग हैं। – Andrew

उत्तर

1

एक सामान्य समाधान के रूप में आप सिग्नल() का उपयोग कर माता-पिता में सिग्नल हैंडलर (SIGUSR1) पंजीकृत कर सकते हैं।

एक बच्चे में: अनइंस्टिस्टर सिग्नल हैंडलर, अगर execl() कॉल विफल हुआ तो आपको माता-पिता को SIGUSR1 भेजने की आवश्यकता है।

माता-पिता में: प्रत्येक बच्चे की पिड हम std :: set में स्टोर करेंगे। जब सभी बच्चे बनाए जाते हैं तो आप बच्चों को ट्रैक करने के लिए बस एक अलग धागा बनाते हैं। थ्रेड फ़ंक्शन में बस प्रतीक्षा करें() और सेट से पिड को हटा दें। SIGCHLD सिग्नल सुनने का एक और तरीका (लेकिन इससे अधिक जटिल समाधान हो जाएंगे, इसलिए यदि कोई अन्य थ्रेड स्पॉन होता है तो मैं थ्रेड का उपयोग करता हूं)।

जब सेट खाली है तो हमने किया है।

+0

यह अच्छा जेनेरिक समाधान की तरह दिखता है। मैंने इसके बारे में विशेष संकेत के बिना सोचा, लेकिन संकेत के साथ यह भी तर्कसंगत रूप से पूरा दिखता है। धन्यवाद। – Arkady

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