我刚刚听了一个演讲,总结为:

收获

  • 由父进程对终止的子进程执行(使用 wait 或 waitpid)

    parent 获得退出状态信息

    内核然后删除僵尸子进程

  • 所以我明白收割是通过从父进程调用 waitwaitpid 来完成的,之后内核会删除僵尸进程。如果确实如此,那么只有在调用 waitwaitpid 时才会进行收割,为什么子进程在返回 theor 入口函数后实际上消失了 - 我的意思是确实看起来好像子进程已经被收割了,因此没有即使父进程可能没有等待,也会浪费资源。

    那么只有在调用 waitwaitpid 时才能“收割”吗?只要进程返回并退出它们的入口函数(我假设所有进程都这样做),进程是否会被“收割” - 谈论“收割”好像它是特殊的东西有什么意义?

    最佳答案

    子进程退出时并没有完全“消失”。它不再作为正在运行的进程存在,并且它的大部分/所有资源(内存、打开的文件等)都被释放,但它仍然保留在进程表中。它保留在进程表中,因为这是存储其退出状态的位置,以便父进程可以通过调用 wait 变体之一来检索它。如果父进程调用 wait 失败,进程表条目会一直存在——这就是使它成为“僵尸”的原因。

    我说它的大部分/所有资源都被释放了,但肯定仍在消耗的一种资源是进程表槽。

    只要(死)子进程的父进程存在,内核就不知道父进程最终不会调用 wait,所以进程表槽必须留在那里,以便最终调用 wait(如果有的话)一)可以返回正确的退出状态。

    如果父进程最终退出(从未调用 wait ),子进程将被祖父进程继承,这通常是一个“主”进程,如 shell 或 init ,它会例行调用 wait 并且最终“收割”穷人年轻的僵尸。

    所以,是的,正如您的讲座所说, parent 正确“收获” child 的唯一方法是调用 wait 函数之一。 (或者退出,但如果父级长期运行,那就很糟糕了。)

    关于c - 收割 child 意味着什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63792508/

    10-12 20:40