【问题标题】:kill - does it kill the process right away?kill - 它会立即终止进程吗?
【发布时间】:2012-01-18 03:00:24
【问题描述】:

kill 到底是做什么的?

我有一个父进程一个接一个地创建 100 个(例如)子进程。在任何孩子的工作结束时,我用kill(pid_of_child, SIGKILL) 杀死孩子,而我在ps 输出中看不到它。但是,如果父进程出现问题并且我使用exit(1) 退出父进程(此时只有1 个孩子-我可以在ps 中检查),那时我会看到很多@987654327 @ 其ppid 是父进程的pid 的进程。

这怎么可能? kill 没有完全杀死子进程吗?

【问题讨论】:

  • @ChrisO:内核永远不会收割僵尸。只有init 会收割僵尸,而且只有自己的孩子会收割僵尸。
  • @Dietrich Epp,感谢您的更正。
  • 我有一个后续问题:stackoverflow.com/questions/8481803/…

标签: c process freebsd kill defunct


【解决方案1】:

kill 不会杀死任何东西。它向目标进程发送信号。 SIGKILL 只是一个信号。现在,SIGKILL 的标准操作——实际上,唯一的操作,因为SIGKILL 不能被进程处理或忽略——是退出,这是真的。

”进程是一个没有被回收的子进程,这意味着父进程没有调用wait()来检索子进程的退出状态。在父进程调用wait() 之前,已失效(或“僵尸”)进程将一直存在。

【讨论】:

  • "现在,SIGKILL 的标准操作是退出,这是真的。" - 值得一提的是,它不能有“非标准操作”,因为 SIGKILL 不能被捕获或忽略(例如,与 SIGTERM 形成对比,它经常被捕获以执行干净的进程终止)。
  • 感谢 Ernest 和 @Dietrich Epp:所以,当 kill 被调用一个 pid 时,在 ps 输出中看不到该 pid,但这并不意味着它全部完成并且该 pid已返回处理表。 - 这是一个正确的假设吗?所以,父母应该在kill孩子之后立即wait 避免<defunct>s?
  • 您是否会在ps 输出中看到孩子取决于您提供给ps 的选项(以及我想该工具的具体实现)。但是,是的,当孩子离开时致电wait() 是个好主意。当孩子退出时,您通常会收到SIGCHLD 信号;现在是在该信号的处理程序中调用wait() 的好时机。
  • 所以,我可以在 kill() 之后立即调用 wait(),如下所示:kill (pid_of_child, SIGKILL); waitpid(pid_of_child, &status, WNOHANG); - 那会是正确的方法吗?
  • 是的(如果你要杀死自己的子进程。)父进程必须是调用wait()的那个。
【解决方案2】:

每当一个进程结束时,无论它如何结束(kill 或其他方式),它都会留在内核的进程表中,直到其父进程检索到它的退出状态(与wait 和朋友一起)。将它留在进程表中可以避免许多讨厌的竞争条件。

如果您的父进程已退出,则应将子进程重新分配给 init,它会定期获取其子进程。

【讨论】:

  • 那么,如果我想避开/Zombies,父母应该怎么做呢?就我而言,在错误情况下,我正在从父母那里做exit()。退出前我应该做些什么(清理)吗?
  • 很久以前。但答案是,在 fork 你的孩子之前调用 signal(SIGCHLD, SIG_IGN) ,他们几乎会立即重复
【解决方案3】:

是的,SIGKILL 会终止进程,但在任何情况下(正常退出或终止),进程都有退出状态,需要为潜在读者保留该状态 - 因为进程表中的此类条目可能会保留到此已经完成了。见http://en.wikipedia.org/wiki/Zombie_process

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    相关资源
    最近更新 更多