发布
社区首页 >问答首页 >在POSIX中检查退出的子进程?

在POSIX中检查退出的子进程?
EN

Stack Overflow用户
提问于 2011-05-08 10:00:16
回答 2查看 1.1K关注 0票数 0

我正在尝试编写一个程序来检查退出的子进程,并在它们退出时重新启动它们。它需要在进程退出时重新启动它们,而不等待任何其他进程退出。我有点迷路了。这是我到目前为止所做的代码。它并没有完成或正确,真的。但也许有人能给我指个正确的方向?

代码语言:javascript
代码运行次数:0
复制
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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-08 10:28:45

您的方法的问题是,您将阻塞waitpid,直到第一个第0个孩子死亡,而其他任何一个孩子可能在此期间死亡。

您可以:

(1)使用wait()代替waitpid()。这将处理任何子进程,但它将阻塞。

(2)在循环时使用waitpid()和WNOHANG标志轮询已死的孩子。

(3)设置信号处理程序,捕获SIGCHILD信号。将waitpid/WNOHANG循环放在您的处理程序中,但在它之外执行重新启动的工作。

例如,Handler会做类似这样的事情:

代码语言:javascript
代码运行次数:0
复制
   while ((child_pid = waitpid(-1, &status, WNOHANG)) > 0) 
   {
        //set a flag or whatever; not wise to fork/exec in handler
   }
票数 3
EN

Stack Overflow用户

发布于 2011-05-08 10:23:53

我不知道您为什么要使用WUNTRACED选项。当它说“停止”的时候,我很确定它的意思和挂起是一样的,而不是退出。

两种可能的方法:

而不是循环,只需这样做:

代码语言:javascript
代码运行次数:0
复制
pid_t pid = wait();

它将一直阻塞,直到进程完成。

或者,将第三个参数waitpid()WUNTRACED更改为WNOHANG。这将让它在不阻塞的情况下测试每个进程。在这种情况下,您可能希望在每次遍历循环的末尾添加一个小睡眠。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5925177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档