检查POSIX中退出的子进程?

问题描述:

我想写一个程序,检查退出的子进程,并重新启动它们,如果他们退出。它需要在进程退出时重新启动进程,而不必等待任何其他进程退出。我有点迷路。以下是我迄今为止所做的代码。它没有完成或没有改变,真的。但也许有人可以指出我正确的方向?检查POSIX中退出的子进程?

for(int ifile = 1; ifile < 4; ifile++){ 

    child_pid[ifile - 1] = vfork(); 

    if(child_pid[ifile - 1] == -1){ 
     cerr << "fork error on " << argv[ifile] << endl; 
    } 
    else if(child_pid[ifile - 1] == 0){ 
     execl(argv[ifile], argv[ifile], NULL); 
    } 
} 

for(int index = 0; index < 3; index++){ 
    do{ 
     wait_pid = waitpid(child_pid[index], &status, WUNTRACED); 
     if(WIFEXITED(status)){ 
      count++; 
      child_pid[index] = vfork(); 
      if(child_pid[index] == -1){ 
       cerr << "rescheduled process error" << endl; 
       return -1; 
      } 
      else if(child_pid[index] == 0){ 
       cout << "Rescheduling " << argv[index + 1] << endl; 
       execl(argv[index + 1], argv[index + 1], NULL); 
      } 
     } 
    }while(count != 4); 
} 

您的方法存在的问题是,您将阻止waitpid,直到第1个孩子死亡,其他任何人都可能在此期间死亡。 (1)使用wait()而不是waitpid()。(1)使用wait()而不是waitpid()。这将处理任何孩子,但会阻止。 (2)使用waitpid()和WNOHANG标志在循环时轮询死亡的孩子。 (3)建立一个信号处理程序并捕获SIGCHILD信号。将waitpid/WNOHANG循环放入你的处理程序中,但是要在其外部重新启动。

E.G. Handler做类似于:

while ((child_pid = waitpid(-1, &status, WNOHANG)) > 0) 
    { 
     //set a flag or whatever; not wise to fork/exec in handler 
    } 

我不确定为什么要选择WUNTRACED选项。它说“已停止”的地方,我很确定它意味着与暂停而不是退出一样。

两种可能的方法:

而不是循环,只是做:

pid_t pid = wait(); 

它会阻止,直到进程结束。

或者,将第三个参数更改为waitpid(),从WUNTRACED更改为WNOHANG。这将让它在不阻塞的情况下测试每个进程。在这种情况下,您可能需要在每次循环结束时通过循环添加一个小睡眠。