我有一个在后台运行的分叉进程列表,它们有自己的 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 吗?
一些注意事项:
如果这个过程完成了,我不会再问它是完成了还是现在,因为我已经把它从我的清单中删除了。
如果进程仍然处于活动状态,我可能需要一遍又一遍地询问它是否完成。
答案 0 :(得分:0)
你问:
<块引用>pid_t return_pid = waitpid(job_pid, nullptr, WNOHANG);
我在这里正确使用了 waitpid 吗?
是的。如果您的目标是扫描子 PID 列表并无阻塞地检查每个子 PID 以查看是否有任何已终止,则可以这样做。
当然,NULL 状态指针意味着您将无法判断孩子是否正常退出,但您可能不在乎。检查 ECHILD 之类的错误是明智之举,尤其是在生产代码中,这可能表明您的应用程序逻辑或数据已损坏(例如,如果 job_pid
是无意义的)。但是,您所拥有的可能足以满足您的目的。