“kill”函数是同步的吗?

24

kill函数在Linux中是同步的吗?例如,我编程调用kill函数来终止一个进程,它会在预期进程被终止时才返回,还是只发送信号并立即返回?如果是这种情况,我该如何让它等待预期进程被杀死?


2
从个人经验来看,我可以说不是这样的,因为我曾经使用kill命令杀死一个进程,但该进程仍然存在。然后我只能使用kill -9命令。 - Dan Fego
2
请注意:并非所有可以发送到进程的信号都会终止它 - 即使使用 SIGTERMkill 1234 也可能被捕获和绕过。唯一无条件终止进程的方法是使用 kill -9,这相当残酷(没有机会进行清理)。 - Piskvor left the building
2
即使是 kill -9 命令也不能总是立即杀死它,因为有一些状态(特别是状态“D”)在内核线程完成之前它不会死亡。 - Corey Henderson
1
kill 命令只有在内核检查目标进程的传入信号时才能终止该进程。 - osgx
4个回答

26

不行,因为它并没有杀死任何东西,只是向进程发送一个信号。

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

你不能阻止使用 kill -9 发送 SIGKILL 信号。

要等待进程死亡:

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

+1 表示展示了一种简单的等待 pid 消失的方法。 - Corey Henderson
1
SIGKILL 无法被进程阻止或忽略。但你说得对,该进程不会立即终止。如果一个进程正在执行系统调用,它只有在系统调用返回时才会结束。因此,如果它正在进行一些真正的重型处理,可能需要一些时间。 - ugoren
2
如果进程处于“不可中断”状态,它也将拒绝退出。 - Robert Martin

4

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

验证这个假设不应该很难。启动进程 A 并使其处理 SIGTERM 信号,在死亡之前等待 10 秒。然后启动进程 B,向 A 发送一个 SIGTERM 信号并立即退出。


3

kill系统调用不会等待其他进程做任何事情。信号被发送到目标进程,系统调用返回。目标进程在被调度运行时注意到信号。


2
  1. 编号为man 2 kill
  2. man wait

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接