2010-12-11 10 views
5

यह एक मेरी काटनेवाला में How to squeeze in additional parameters to a reaper function when a parent is signalled to kill a child (c)?प्रतीक्षा करें()/प्रतीक्षापिड() 1 लौटाता है, बच्चे की पिड नहीं, उसे कैसे ठीक किया जाए?

लिए अनुवर्ती है(), मैं प्राप्त करने के लिए बच्चे के माता-पिता के बारे में pid (गैर क्रूर शब्द यहाँ) खत्म करने के लिए है की कोशिश करो। लेकिन प्रतीक्षा करें() बच्चे की पिड वापस नहीं करता है; इसके बजाय, यह 1 लौटाता है। मुझे 1 के रिटर्न वैल्यू के लिए कोई डॉक्टर नहीं मिल रहा है। कोई सिर ऊपर?

void reaper(int sig) 
{ 
    int status, killedpid; 

    while(killedpid = (/*waitpid(-1, &status, WNOHANG)*/wait(&status)) >= 0) 
    { 
     printf("reaper %d killed %d\n", getpid(), killedpid); 
    } 
} 

मेरे परिणाम:

reaper 5933 killed 1 //actual child pid is 5936 

अग्रिम धन्यवाद!

+0

ओह, मैं कहता हूं कि शब्दावली के साथ आगे बढ़ें। यह * निक्स के मजे का हिस्सा है। "बच्चे की मृत्यु हो गई, और माता-पिता ने ज़ोंबी प्रक्रिया काट दिया।" – Thanatos

उत्तर

13

यह सशर्त त्रुटि में क्लासिक काम है - अभिव्यक्ति निम्नलिखित के रूप में मूल्यांकन किया जाता है (क्योंकि तुलना में अधिक है precedence तो काम):

if (killedpid = (wait(&status) >= 0)) { ... 

killedpid सही के एक मूल्य मिल जाएगा, जो 1 है सी में इस प्रयोग के कोष्ठक के चारों ओर पाने के लिए और उच्च चेतावनी का स्तर-Wall -pedantic की तरह साथ संकलन:

if ((killedpid = wait(...)) >= 0) { ... 
+0

आपकी अंतर्दृष्टि के लिए बहुत बहुत धन्यवाद! –

+0

वही PHP पर लागू होता है। मैंने 'pcntl_waitpid()' का उपयोग किया था और वही त्रुटि थी जिसके कारण वापसी मान हमेशा '1' के रूप में दिखाई देता था। – Marki555

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