2015-12-13 87 views
0

我有一些麻煩得到waitpid工作有人請解釋這個代碼有什麼問題嗎?fork()和waitpid()不等待孩子

#include <iostream> 
#include <sys/wait.h> 
#include <unistd.h> 
using namespace std; 

int main() { 
    string filename_memory; 
    decltype(fork()) pid; 

    if (!(pid = fork())) { 
     cout << "in child" << endl; 
     sleep(1); 
    } 

    else { 
     int status_child; 

     do { 
      waitpid(pid, &status_child, WNOHANG); 
      cout << "waiting for child to finish" << endl; 
     } while (!WIFEXITED(status_child)); 

     cout << "child finished" << endl; 
    } 

    return 0; 
} 
+0

你可能要檢查waitpid'的'返回值和閱讀'status_child'僅如果返回值等於'pid',像' if(ret == pid && WIFEXITED(status_child))break;' –

回答

3

如果等待()或waitpid函數()返回,因爲一個子進程 的狀態可用,這些函數將返回等於針對狀態報告的子進程的 進程ID值。

如果waitpid函數()與期權WNOHANG集調用,它已經由pid指定至少 一個子進程針對狀態不可用, 和地位不可用於pid指定的任何過程中,0是 回。否則,應返回(pid_t)-1,並將errno設置爲 指示錯誤。

這意味着status_child變量沒有意義,直到waitpid返回孩子的pid。

您可以通過應用這些改變解決這個問題:

int ret; 
do { 
    ret = waitpid(pid, &status_child, WNOHANG); 
    cout << "waiting for child to finish" << endl; 
} while (ret != pid || !WIFEXITED(status_child)); 

cout << "child finished" << endl;