如果孩子在父母调用wait()之前退出,该怎么办?

时间:2019-05-06 13:33:49

标签: c unix

我正在学习C语言中的wait()方法。我知道它会阻塞父进程,直到其子进程之一终止。但是,如果内核决定先调度子进程,而子进程在父进程可以调用wait()之前终止,该怎么办?父母是否会一直等待在那里(没有其他中断),因为它无法观察到孩子的归来?

在照片中,如果执行顺序为:fork-> HC-> exit-> HP-> wait,那么我描述的情况将会发生。 enter image description here

2 个答案:

答案 0 :(得分:4)

不,父母不会永远等待。

wait上的文档指出:

  

所有这些系统调用都用于等待状态更改          调用过程的子进程,并获取有关该子进程的信息          其状态已改变。 状态更改被认为是:          孩子被终止;这个孩子被一个信号挡住了;或者那个孩子是          通过信号恢复。 对于终止的孩子,请执行          等待允许系统释放与          儿童;如果不执行等待,则终止的子项仍保留          处于“僵尸”状态

     

如果孩子的状态已经改变,则这些呼叫会立即返回。

答案 1 :(得分:2)

  

但是,如果内核决定先调度子进程,然后   子进程在父可以调用wait()之前终止?

这是一个很可能的情况。如果wait系列功能之一被父级使用,或者signal(SIGCHLD, SIG_IGN);fork之前被显式调用,即使父进程被抢占,也不会使子级变成僵尸。

此外,提到的等待或信号无知的需要是清除进程的未使用数据。在使用其中一种方法时,内核将被告知不再使用child(ren)进程。因此,您可以清除未使用的系统资源。