等待子进程

问题描述:

我尝试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

你不应该”在函数中声明errno这样。

int errno; 

包含头文件errno.h代替(不知道这是造成你的困扰,虽然)。

+0

谢谢,我修好了。但它没有解决问题,它继续下去。 – xyzt 2010-08-24 08:41:27

您通过调用“pid = fork();”来创建另一个孩子“在“开关”的默认部分。这个孩子将会到达wait()函数调用,并且肯定会中断并退出。 真正的父母进程将继续运行,直到所有的孩子退出。