C waitpid,这是矛盾吗?

问题描述

在我之前的问题中:How to check if a process has been finished?

您向我展示了如何检查子进程是否已完成,代码如下:

pid_t r = waitpid(pid,&status,WNOHANG)//if r==pid then process finished

如果我想等待进程完成(假设它仍在运行)怎么办?

我在网上看到解决方案是一样的,即:

pid_t r = waitpid(pid,WNOHANG)

这是否意味着我们对 2 个不同的工作有相同的命令?这对我来说没有意义。

解决方法

我不知道你在哪里读到 waitpid(pid,&status,WNOHANG) 块,但这是错误的。要阻塞直到进程结束*,请使用

waitpid(pid,0)

来自 waitpid 的手册页:

所有这些系统调用都用于等待调用进程的子进程的状态变化

WNOHANG 会覆盖它。

WNOHANG 如果没有孩子退出,则立即返回。


* 如果您有信号处理程序,它也可以在被信号中断时返回(错误 EINTR)。