2010-08-24 246 views
1

我嘗試fork子進程並等待它們死亡。我首先fork N個子進程,然後等待一個循環。但它似乎並沒有等待孩子的死亡過程。儘管孩子們並沒有死亡,但它仍然退出了循環。這裏是我的代碼:等待子進程

void DistributorSubsystem::Start() 
{ 
     Application::instance().logger().information("Distributor Subsytem start"); 
     //start all the distributors 
     pid_t pid = fork(); 
     pid_t p; 
     for (size_t i=0;i<_distributors.size();++i) 
     { 
       switch(pid) 
       { 
         case -1: 
           perror("fork"); 
           exit(-1); 
         case 0: 
           p = getpid(); 
           printf("PID=%d\n", p); 
           _distributors[i]->Start(); 
           Application::instance().logger().information("End of child"); 
           exit(0); 
         default: 
           pid = fork(); 
       } 
     } 
     int errno; 
     //wait for child processes to die 
     while (true) 
     { 
       int status; 
       pid_t done = wait(&status); 
       if (done == -1) 
       { 
         if (errno == ECHILD) break; // no more child processes 
       } 
       else 
       { 
         if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) 
         { 
           std::stringstream s; 
           s<<done; 
           Application::instance().logger().error("pid " + s.str() + " failed"); 
           exit(-1); 
         } 
       } 
     } 
     Application::instance().logger().information("All started"); 
} 

這裏的輸出:

PID = 7311 ThriftDistributor實例中啓動: PID = 7312 ThriftDistributor實例中啓動: 都開始 分銷Subsytem UNINIT

+0

第5行叉的目的是什麼? – mathk 2010-08-24 08:23:50

+0

讓switch語句第一次工作是早期的工作。但是,這是一個錯誤。該計劃啓動一個孩子超過通緝。在/ default:/語句中,/ i /需要再次針對/distributors.size()/進行測試[最後一個孩子需要比父進程多運行for循環]。 – ypnos 2010-08-24 09:09:40

回答

0

你不應該」在函數中聲明errno這樣。

int errno; 

包含頭文件errno.h代替(不知道這是造成你的困擾,雖然)。

+0

謝謝,我修好了。但它沒有解決問題,它繼續下去。 – xyzt 2010-08-24 08:41:27

2

您通過調用「pid = fork();」來創建另一個孩子「在「開關」的默認部分。這個孩子將會到達wait()函數調用,並且肯定會中斷並退出。 真正的父母進程將繼續運行,直到所有的孩子退出。