我正在学习C语言中的wait()方法。我知道它会阻塞父进程,直到其子进程之一终止。但是,如果内核决定先调度子进程,而子进程在父进程可以调用wait()之前终止,该怎么办?父母是否会一直等待在那里(没有其他中断),因为它无法观察到孩子的归来?
答案 0 :(得分:4)
不,父母不会永远等待。
wait
上的文档指出:
所有这些系统调用都用于等待状态更改 调用过程的子进程,并获取有关该子进程的信息 其状态已改变。 状态更改被认为是: 孩子被终止;这个孩子被一个信号挡住了;或者那个孩子是 通过信号恢复。 对于终止的孩子,请执行 等待允许系统释放与 儿童;如果不执行等待,则终止的子项仍保留 处于“僵尸”状态。
如果孩子的状态已经改变,则这些呼叫会立即返回。
答案 1 :(得分:2)
但是,如果内核决定先调度子进程,然后 子进程在父可以调用
wait()
之前终止?
这是一个很可能的情况。如果wait
系列功能之一被父级使用,或者signal(SIGCHLD, SIG_IGN);
在fork
之前被显式调用,即使父进程被抢占,也不会使子级变成僵尸。
此外,提到的等待或信号无知的需要是清除进程的未使用数据。在使用其中一种方法时,内核将被告知不再使用child(ren)进程。因此,您可以清除未使用的系统资源。