C kill函数是同步的吗?

C kill函数是同步的吗?,c,linux,gcc,x86,C,Linux,Gcc,X86,Linux中的kill函数是同步的吗?比方说,我通过编程调用kill函数来终止一个进程,它只会在预期进程终止时返回,还是只发送信号并返回。如果是这种情况,我如何让它等待预期进程被终止?否,因为它不会终止任何东西,所以它只向进程发送一个信号 默认情况下,此信号甚至可以被阻止或忽略 您不能阻止表示发送的SIGKILL 要等待进程结束,请执行以下操作: while kill -0 PID_OF_THE_PROCESS 2>/dev/null; do sleep 1; done kill系统调用

Linux中的
kill
函数是同步的吗?比方说,我通过编程调用
kill
函数来终止一个进程,它只会在预期进程终止时返回,还是只发送信号并返回。如果是这种情况,我如何让它等待预期进程被终止?

否,因为它不会终止任何东西,所以它只向进程发送一个信号

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

您不能阻止表示发送的
SIGKILL

要等待进程结束,请执行以下操作:

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

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

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

做一个实验来验证这个假设应该不难。启动进程A,让它在死亡前以10秒的睡眠时间处理
SIGTERM
。然后启动进程B,它将a
SIGTERM
传递给a并立即退出

  • 否。
    2人死亡
  • 人工等待

  • 另请参见
    man7 signal
    ,了解有关Unix信号的更多详细信息。

    有趣的是,我可以说不,因为我在进程上使用了
    kill
    ,使其返回并使进程仍然存在。然后必须执行一个
    kill-9
    。注意:并不是所有可以发送到进程的信号都会终止它-甚至
    kill 1234
    (使用
    SIGTERM
    )也可以被捕获和绕过。无条件杀戮的唯一方法是使用
    kill-9
    ,这相当残忍(没有清理的机会)。甚至
    kill-9
    也不总是立即杀戮它,因为有一些状态(特别是状态“D”)在这种情况下,它不会死,直到绑定到它的内核线程完成。kill只会在内核检查目标进程的传入信号时终止进程。+1表示等待pid消失的简单方法。SIGKILL不能被进程阻止或忽略。但你是对的,这个过程不会立即终止。如果进程正在执行系统调用,则只有在系统调用返回时才会结束。因此,如果它进行一些真正繁重的处理,可能需要时间。如果它处于
    不间断的状态,它也会拒绝死亡