4

kill - 它会立即终止进程吗?

我找到了答案,并为该处理程序设置SIGCHLD并引入了信号处理wait程序。这样,每当父进程kill成为子进程时,都会调用此处理程序并调用wait获取子进程。- 动机是清除进程表条目。

我仍然看到一些子进程运行了几秒钟,即使它的父进程没有死亡。- 这怎么可能?

我通过ps. 准确地ps -o user,pid,ppid,command -ax和greping父进程,子进程和已失效。

4

2 回答 2

6

一个进程在退出后立即失效(僵尸)(从一个信号,调用到exit,从返回main,等等)。它保持僵尸状态,直到wait被其父级打开。

因此,所有进程在退出时至少会短暂地变成僵尸。

如果父进程在调用之前需要一点时间(因为它正在做其他工作,或者只是因为调度程序还没有给它 CPU 时间)wait,那么你会看到僵尸一段时间。如果父级从不调用wait,那么当它最终退出时,init(pid 1) 将采用它的僵尸子级,并调用wait它们。

于 2011-12-12T22:33:35.923 回答
6

只有当它的父进程没有死亡并且还没有等待它时,子进程才会失效(成为僵尸) 。如果原来的父进程死亡,那么子进程的父进程 ID 为 1,该进程的主要任务是等待其(继承的)子进程死亡并将它们从进程列表中删除,这样它们就不是僵尸了。(注意:孤儿或守护进程由 PID 1 自动继承;它不会分配给进程层次结构的祖父母或曾祖父母。)

在子进程死亡和父进程通过wait()(或waitpid()waitid()或任何其他变体)收集退出信息的时间之间,它是进程列表中的僵尸,如defunct所示ps

但是要回答您的问题的标题:

  • 是的,一个进程可以在其父进程不死的情况下终止。

(而且它只有在它的父母没有死的情况下才能失效。)

于 2011-12-12T22:40:22.470 回答