如何检查分叉进程是否已完成?

时间:2021-05-06 11:40:39

标签: c++ linux unix system-calls wait

我有一个在后台运行的分叉进程列表,它们有自己的 pid,我想每 x 秒检查一次列表中的每一个工作,并报告它是否完成(正常完成工作并且不仅停止了一段时间)然后将其从列表中删除。

void my_func()
{
    auto job = jobs.begin();
    while (job != jobs.end())
    {
        pid_t job_pid = job->pid;
        pid_t return_pid = waitpid(job_pid, nullptr, WNOHANG);
        if (return_pid == job_pid)
        {
            cout << "Finished" << endl;
            //remove from list
        } 
    }
}

我在这里正确使用了 waitpid 吗?


一些注意事项:

  • 如果这个过程完成了,我不会再问它是完成了还是现在,因为我已经把它从我的清单中删除了。

  • 如果进程仍然处于活动状态,我可能需要一遍又一遍地询问它是否完成。

1 个答案:

答案 0 :(得分:0)

你问:

<块引用>
pid_t return_pid = waitpid(job_pid, nullptr, WNOHANG);

我在这里正确使用了 waitpid 吗?

是的。如果您的目标是扫描子 PID 列表并无阻塞地检查每个子 PID 以查看是否有任何已终止,则可以这样做。

当然,NULL 状态指针意味着您将无法判断孩子是否正常退出,但您可能不在乎。检查 ECHILD 之类的错误是明智之举,尤其是在生产代码中,这可能表明您的应用程序逻辑或数据已损坏(例如,如果 job_pid 是无意义的)。但是,您所拥有的可能足以满足您的目的。

相关问题