检查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
。这将让它在不阻塞的情况下测试每个进程。在这种情况下,您可能需要在每次循环结束时通过循环添加一个小睡眠。