c - 如何检查一个进程是否已经完成?
问题描述
这就是我用来检查子进程是否已用 C/cC++ 语言完成的方式:
waitpid(job.pid,&tmp,WNOHANG)>=0;
但是经过一些阅读后,我认为这是错误的,因为我询问的是 waitpid 是否成功完成,而不是询问该过程是否完成。
我怎样才能解决这个问题?
解决方案
当这样调用时,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;
}
推荐阅读
- apache-spark - PySpark 结构化流 - 水印
- version-control - ClearCase - 如何列出所有可能与我的冲突的结帐?
- vba - 带有复制/粘贴和日期/时间戳的 VBA Vlookup
- python - 何时在 Django 的 save() 中使用 force_update?
- sorting - 在 Go 中按 v[i]/w[i] 对 i 的数组进行排序
- c# - 对存储库模式的理解混乱
- r - 根据向量的第一个字符在 R 中重新编码变量
- java - 如何使 Int 只接受整数?
- actions-on-google - 如何在 Webhook api.ai 中触发多个 Intent?
- solr - 如何在 Solr 中使用 jHiccup?