我有一个具有自己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
}
}
}我在这里用得对吗?
一些注释:
如果进程仍然处于活动状态,我可能需要一次又一次地询问它是否已经完成。
发布于 2021-05-06 13:21:06
你问:
pid_t return_pid = waitpid(job_pid,nullptr,WNOHANG);
我在这里用得对吗?
是。如果您的目标是扫描一个子PID列表,并非阻塞地检查每个子程序is是否已经终止,则会这样做。
当然,NULL状态指针意味着您将无法判断孩子是否正常退出,但您可能并不在意。检查诸如ECHILD这样的错误是明智的,特别是在生产代码中,这可能意味着应用程序逻辑或数据已经损坏(例如,如果job_pid是荒谬的)。然而,你所拥有的可能对你的目标来说是足够好的。
https://stackoverflow.com/questions/67417406
复制相似问题