我嘗試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
第5行叉的目的是什麼? – mathk 2010-08-24 08:23:50
讓switch語句第一次工作是早期的工作。但是,這是一個錯誤。該計劃啓動一個孩子超過通緝。在/ default:/語句中,/ i /需要再次針對/distributors.size()/進行測試[最後一個孩子需要比父進程多運行for循環]。 – ypnos 2010-08-24 09:09:40