等待子进程
问题描述:
我尝试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
答
你不应该”在函数中声明errno
这样。
int errno;
包含头文件errno.h
代替(不知道这是造成你的困扰,虽然)。
+0
谢谢,我修好了。但它没有解决问题,它继续下去。 – xyzt 2010-08-24 08:41:27
答
您通过调用“pid = fork();”来创建另一个孩子“在“开关”的默认部分。这个孩子将会到达wait()函数调用,并且肯定会中断并退出。 真正的父母进程将继续运行,直到所有的孩子退出。
第5行叉的目的是什么? – mathk 2010-08-24 08:23:50
让switch语句第一次工作是早期的工作。但是,这是一个错误。该计划启动一个孩子超过通缉。在/ default:/语句中,/ i /需要再次针对/distributors.size()/进行测试[最后一个孩子需要比父进程多运行for循环]。 – ypnos 2010-08-24 09:09:40