2010-05-19 6 views
7

यदि मैं fork एक बाल प्रक्रिया करता हूं, और माता-पिता waitpid पर कॉल करने से पहले बच्चे की प्रक्रिया निकलती है, तो waitpid द्वारा निर्धारित निकास स्थिति जानकारी अभी भी वैध है? यदि हां, तो यह कब मान्य नहीं होता है; यानी, मैं कैसे सुनिश्चित करूं कि मैं बच्चे के पिड पर waitpid पर कॉल कर सकता हूं और मनमाने ढंग से समय के बाद वैध निकास स्थिति जानकारी प्राप्त करना जारी रखता हूं, और मैं "साफ" कैसे करूं (ओएस को बताएं कि अब मुझे इसमें दिलचस्पी नहीं है समाप्त बाल प्रक्रिया के लिए बाहर निकलें स्थिति की जानकारी)?क्या वेटपिड उपज किसी बच्चे की प्रक्रिया के लिए वैध स्थिति की जानकारी देता है जो पहले से ही बाहर निकल चुका है?

मैं निम्नलिखित कोड के साथ खेल रहा था, और ऐसा प्रतीत होता है कि बाहर निकलने की स्थिति की जानकारी बच्चे खत्म होने के कम से कम कुछ सेकंड के लिए मान्य है, लेकिन मुझे नहीं पता कि ओएस को कितनी देर या कैसे सूचित किया जाए I waitpid फिर से कॉल नहीं किया जाएगा: के बाद बच्चे को बाहर निकल गया है

#include <assert.h> 
#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/wait.h> 

int main() 
{ 
    pid_t pid = fork(); 

    if (pid < 0) { 
     fprintf(stderr, "Failed to fork\n"); 
     return EXIT_FAILURE; 
    } 
    else if (pid == 0) { // code for child process 
     _exit(17); 
    } 
    else { // code for parent 
     sleep(3); 

     int status; 
     waitpid(pid, &status, 0); 
     waitpid(pid, &status, 0); // call `waitpid` again just to see if the first call had an effect 
     assert(WIFEXITED(status)); 
     assert(WEXITSTATUS(status) == 17); 
    } 

    return EXIT_SUCCESS; 
} 

उत्तर

10

हाँ, waitpid काम करेंगे। ओएस माता-पिता waitpid (या अन्य wait-फ़ामली फ़ंक्शन) तक या जब तक अभिभावक बाहर निकलता है (जिस बिंदु पर स्थिति init प्रक्रिया द्वारा एकत्र की जाती है) तक ओएस प्रक्रिया प्रक्रिया तालिका (बाहर निकलने की स्थिति सहित) में एक बाल प्रक्रिया 'प्रविष्टि रखेगी) । यह एक "ज़ोंबी" प्रक्रिया है: एक प्रक्रिया जो कि बाहर निकलती है, अभी भी इस उद्देश्य के लिए प्रक्रिया तालिका में निवासी है।

तालिका में प्रक्रिया 'प्रविष्टि waitpid पर पहली कॉल के बाद दूर होनी चाहिए। मुझे इस बात का संदेह है कि आपके उदाहरण में आप waitpid पर कॉल करने में सक्षम होने लगते हैं, इसलिए waitpidstatus तर्क को संशोधित नहीं करेगा यदि pid अब मौजूद नहीं है। तो पहला कॉल काम कर रहा है और status भर रहा है, और दूसरा कॉल एक त्रुटि कोड लौटा रहा है और status नहीं बदलना चाहिए। आप waitpid कॉल के वापसी मानों का निरीक्षण करके और/या दो अलग-अलग status चर का उपयोग करके इसे सत्यापित कर सकते हैं।

+0

वास्तव में, दूसरा 'प्रतीक्षापिप' कॉल विफल हो गया। मैंने इसके बारे में नहीं सोचा था! इस बारे में बताने के लिए शुक्रिया। –

3

ओएस एक zombie state अपनी मूल तक (init हो सकता है यदि मूल जनक प्रक्रिया पहले समाप्त) में समाप्त प्रक्रिया रहता wait(2) सिस्टम कॉल के साथ, जो बाहर निकलने स्थिति एकत्र करता है। तो जवाब है - प्रक्रिया की निकास स्थिति अमान्य नहीं बनती है।

2

हां।

man page से:

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

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