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

How to check if a process has been finished?

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

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

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

我该如何解决这个问题?

当这样调用时,waitpid可以return三件事

  • 0:状态不可用。也就是说进程还是运行.
  • -1: 一个错误。 errno 应该检查。它可以是 EINTR,在这种情况下,您应该再次尝试调用 waitpid。它也可以是 ECHILD,在这种情况下,您要么已经确定进程已经提前结束,要么它是一个 invalid/unrelated pid。如果发生这种情况,说明您的程序逻辑有问题。
  • 您要求的 pid。在这种情况下,过程结束。 它是如何 结束的,您可以使用第二个参数中的值 returned 进行检查,在您的情况下为 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;
}