我有些困惑。据我所知,waitpid使用pid为-1的选项意味着我等待所有子进程结束,但如果我在waitpid中添加WNOHANG选项,则该选项表示如果没有任何子进程结束就立即退出……这似乎非常令人困惑。
我为什么要告诉计算机等待子进程完成然后立即告诉它如果没有任何子进程完成就立即退出呢?
有人可以解释一下这个选项和WUNTRACED选项吗?我不知道什么是被跟踪的意思。
我有些困惑。据我所知,waitpid使用pid为-1的选项意味着我等待所有子进程结束,但如果我在waitpid中添加WNOHANG选项,则该选项表示如果没有任何子进程结束就立即退出……这似乎非常令人困惑。
我为什么要告诉计算机等待子进程完成然后立即告诉它如果没有任何子进程完成就立即退出呢?
有人可以解释一下这个选项和WUNTRACED选项吗?我不知道什么是被跟踪的意思。
通常情况下,你会在不同的情况下使用WNOHANG和WUNTRACED。
情况1:假设你有一个进程会生成许多子进程,并需要在子进程运行时执行其他任务。这些子进程有时会退出或被杀死,但内核会保留其退出状态,直到其他进程通过wait()或waitpid()来获取它们的退出状态。因此,父进程需要定期调用wait() / waitpid()来让内核清理掉已经死亡的子进程。但是我们不希望wait()/waitpid()被阻塞,因为在这种情况下,我们的进程需要执行其他任务。我们只希望收集已经dead的进程的状态,如果有的话。这就是WNOHANG的作用。它防止wait() / waitpid()阻塞以便您的进程可以继续进行其他任务。如果有子进程死亡,它的pid将通过wait() / waitpid()返回,然后您的进程可以对其进行处理。如果没有任何进程死亡,则返回的pid为0。
情况2:相反地,假设你的父进程在子进程运行时不想执行任何操作。你不想让它执行某些无用的循环,因此你使用一个不带WNOHANG参数的普通wait() / waitpid()。您的进程将从执行队列中移除,直到其中一个子进程死亡。但是,如果其中一个子进程因为收到SIGSTOP而被暂停了呢?你的子进程不再在处理你分配给它的任务,但父进程仍在等待。所以,在某种意义上,你陷入了一种死锁状态,除非该子进程通过父进程外部手段(如发送SIGCONT)继续运行。WUNTRACED允许您在子进程停止、退出或被杀死时从wait() / waitpid()返回父进程。这样,你就有机会发出SIGCONT来继续运行它,杀死它,将其任务分配给另一个子进程,或者进行其他操作。
wait(2)
。 - melpomene-1
,它不会等待所有子进程完成,而是等待任何一个子进程完成。一旦有任何一个子进程完成,它就被回收了。 - fuz