我刚刚听了一个演讲,总结为:
收获
parent 获得退出状态信息
内核然后删除僵尸子进程
所以我明白收割是通过从父进程调用
wait
或 waitpid
来完成的,之后内核会删除僵尸进程。如果确实如此,那么只有在调用 wait
或 waitpid
时才会进行收割,为什么子进程在返回 theor 入口函数后实际上消失了 - 我的意思是确实看起来好像子进程已经被收割了,因此没有即使父进程可能没有等待,也会浪费资源。那么只有在调用
wait
或 waitpid
时才能“收割”吗?只要进程返回并退出它们的入口函数(我假设所有进程都这样做),进程是否会被“收割” - 谈论“收割”好像它是特殊的东西有什么意义? 最佳答案
子进程退出时并没有完全“消失”。它不再作为正在运行的进程存在,并且它的大部分/所有资源(内存、打开的文件等)都被释放,但它仍然保留在进程表中。它保留在进程表中,因为这是存储其退出状态的位置,以便父进程可以通过调用 wait
变体之一来检索它。如果父进程调用 wait
失败,进程表条目会一直存在——这就是使它成为“僵尸”的原因。
我说它的大部分/所有资源都被释放了,但肯定仍在消耗的一种资源是进程表槽。
只要(死)子进程的父进程存在,内核就不知道父进程最终不会调用 wait
,所以进程表槽必须留在那里,以便最终调用 wait
(如果有的话)一)可以返回正确的退出状态。
如果父进程最终退出(从未调用 wait
),子进程将被祖父进程继承,这通常是一个“主”进程,如 shell 或 init
,它会例行调用 wait
并且最终“收割”穷人年轻的僵尸。
所以,是的,正如您的讲座所说, parent 正确“收获” child 的唯一方法是调用 wait
函数之一。 (或者退出,但如果父级长期运行,那就很糟糕了。)
关于c - 收割 child 意味着什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63792508/