【问题标题】:How to check if forked process has finished?如何检查分叉进程是否已完成?
【发布时间】:2021-07-28 17:26:18
【问题描述】:

我有一个在后台使用自己的 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 吗?


一些注意事项:

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

  • 如果该过程仍然有效,我可能需要一遍又一遍地询问它是否已完成。

【问题讨论】:

  • fork() 呼叫发生在哪里?
  • 据我回忆,您对waitpid 的使用会检测到指定进程中的“状态更改”——不一定是完成。手册页中的 examples 提供了更符合您所追求的详细用法。

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


【解决方案1】:

你问:

pid_t return_pid = waitpid(job_pid, nullptr, WNOHANG);

我在这里正确使用 waitpid 吗?

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

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

【讨论】:

    猜你喜欢
    • 2021-07-13
    • 2021-11-08
    • 1970-01-01
    • 2021-11-15
    • 2017-11-13
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多