【问题标题】:Is kill function synchronous?杀死功能是同步的吗?
【发布时间】:2012-02-04 10:36:11
【问题描述】:

Linux 中的kill 函数是同步的吗?比如说,我以编程方式调用kill 函数来终止一个进程,它只会在预期的进程终止时返回,还是只发送信号并返回。如果是这样,我怎样才能让它等待预期的进程被杀死?

【问题讨论】:

  • 有趣的是,我可以说不,因为我在一个进程上使用了kill,让它返回并且进程仍然存在。然后不得不做一个kill -9
  • 注意:并非所有可以发送到进程的信号都会终止它——即使是kill 1234(使用SIGTERM)也可以被捕获和绕过。无条件杀死的唯一方法是使用kill -9,这是相当残酷的(没有机会清理)。
  • 即使kill -9 也不会立即杀死它,因为在某些状态(特别是状态“D”)中,它在与绑定的内核线程完成之前不会死亡。
  • kill 只会在内核检查目标进程的传入信号时终止进程。

标签: c linux gcc x86


【解决方案1】:

不,因为它不会杀死任何东西,它只会向进程发送一个信号。

默认情况下,甚至可以阻止或忽略此信号。

你不能屏蔽代表发送SIGKILLkill -9

等待进程终止:

while kill -0 PID_OF_THE_PROCESS 2>/dev/null; do sleep 1; done

【讨论】:

  • +1 用于显示等待 pid 消失的简单方法。
  • SIGKILL 不能被进程阻止或忽略。但是您是对的,该过程不会立即终止。如果一个进程正在执行系统调用,它只会在系统调用返回时结束。因此,如果它进行一些真正繁重的处理,可能需要时间。
  • 如果是UNINTERRUPTIBLE的状态也会拒死
【解决方案2】:

kill 不能同步,因为它只发送一个信号。目标进程可能会忽略传入的信号(参见SIG_IGN),因此无法保证kill 的效果。

做一个实验来验证这个假设应该不难。启动进程 A 并使其处理 SIGTERM 并在死亡前休眠 10 秒。然后启动进程 B,该进程将 SIGTERM 传递给 A 并立即退出。

【讨论】:

    【解决方案3】:

    kill 系统调用不等待其他进程执行任何操作。信号被发送到目标进程,系统调用返回。目标进程在计划运行时会注意到该信号。

    【讨论】:

      【解决方案4】:
      1. 没有。 man 2 kill
      2. man wait

      有关 Unix 信号的更多详细信息,另请参阅 man 7 signal

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-21
        • 2014-03-07
        • 1970-01-01
        • 2015-12-31
        • 1970-01-01
        • 2014-05-04
        • 1970-01-01
        相关资源
        最近更新 更多