首页 > 解决方案 > 如何检查一个进程是否已经完成?

问题描述

这就是我用来检查子进程是否已用 C/cC++ 语言完成的方式:

waitpid(job.pid,&tmp,WNOHANG)>=0;

但是经过一些阅读后,我认为这是错误的,因为我询问的是 waitpid 是否成功完成,而不是询问该过程是否完成。

我怎样才能解决这个问题?

标签: clinuxunixprocess

解决方案


当这样调用时,waitpid可以返回三个东西

  • 0:状态不可用。这意味着该过程仍在运行。
  • -1:错误。errno应该检查。可以EINTR,在这种情况下,您应该waitpid再次尝试调用。也可以是ECHILD,在这种情况下,您要么已经确定进程已提前结束,要么是无效/不相关的 pid。如果发生这种情况,则说明您的程序逻辑有问题。
  • 您要求的 pid。在这种情况下,该过程结束。具体如何结束,您可以根据您的情况使用第二个参数tmp中返回的值进行检查。手册页中解释了有关此值的各种宏。

因此,无需关心进程退出状态,您可以像这样检查它:

bool isdone(pid_t pid)
{
    int status;
    while((pid_t r = waitpid(pid, &status, WNOHANG) != pid)
    {
        if(r == 0) return false;
        if(errno == EINTR) continue;
        // handle errors
    }
    return true;
}

推荐阅读