kill
函数在Linux中是同步的吗?例如,我编程调用kill
函数来终止一个进程,它会在预期进程被终止时才返回,还是只发送信号并立即返回?如果是这种情况,我该如何让它等待预期进程被杀死?
不行,因为它并没有杀死任何东西,只是向进程发送一个信号。
默认情况下,这个信号甚至可以被阻止或忽略。
你不能阻止使用 kill -9
发送 SIGKILL
信号。
要等待进程死亡:
while kill -0 PID_OF_THE_PROCESS 2>/dev/null; do sleep 1; done
kill
命令不能同步执行,因为它只发送一个信号。目标进程可能会忽略接收到的信号(参见 SIG_IGN
),因此无法保证 kill
的效果。
验证这个假设不应该很难。启动进程 A 并使其处理 SIGTERM
信号,在死亡之前等待 10 秒。然后启动进程 B,向 A 发送一个 SIGTERM
信号并立即退出。
kill系统调用不会等待其他进程做任何事情。信号被发送到目标进程,系统调用返回。目标进程在被调度运行时注意到信号。
man 2 kill
man wait
有关Unix信号的更多详细信息,请参见man 7 signal
。
kill
命令杀死一个进程,但该进程仍然存在。然后我只能使用kill -9
命令。 - Dan FegoSIGTERM
的kill 1234
也可能被捕获和绕过。唯一无条件终止进程的方法是使用kill -9
,这相当残酷(没有机会进行清理)。 - Piskvor left the buildingkill -9
命令也不能总是立即杀死它,因为有一些状态(特别是状态“D”)在内核线程完成之前它不会死亡。 - Corey Henderson