C kill函数是同步的吗?
Linux中的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系统调用
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,它将aSIGTERM
传递给a并立即退出
2人死亡
人工等待
另请参见
man7 signal
,了解有关Unix信号的更多详细信息。有趣的是,我可以说不,因为我在进程上使用了kill
,使其返回并使进程仍然存在。然后必须执行一个kill-9
。注意:并不是所有可以发送到进程的信号都会终止它-甚至kill 1234
(使用SIGTERM
)也可以被捕获和绕过。无条件杀戮的唯一方法是使用kill-9
,这相当残忍(没有清理的机会)。甚至kill-9
也不总是立即杀戮它,因为有一些状态(特别是状态“D”)在这种情况下,它不会死,直到绑定到它的内核线程完成。kill只会在内核检查目标进程的传入信号时终止进程。+1表示等待pid消失的简单方法。SIGKILL不能被进程阻止或忽略。但你是对的,这个过程不会立即终止。如果进程正在执行系统调用,则只有在系统调用返回时才会结束。因此,如果它进行一些真正繁重的处理,可能需要时间。如果它处于不间断的状态,它也会拒绝死亡