如何检查进程是否已经完成?
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;
}
这就是我以前用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;
}