sigkill不会终止C程序

时间:2016-03-05 23:21:12

标签: c linux signals

我认为sigkill始终有效吗?我的程序中有一个信号处理程序,当你按Ctrl-C时会显示一个退出提示。这工作正常,但是当我通过命令行终止时,我如何使它工作?现在kill命令什么都不做。有没有什么我应该在我的代码中实现杀死工作?

3 个答案:

答案 0 :(得分:3)

您无法为SIGKILL设置信号处理程序。

您的流程无法回复SIGKILL。它是单方面立即终止的;这个过程不能做任何清理。 O / S释放分配给它的资源,就像它对任何其他死进程一样。

请参阅POSIX Signal Conceptssigaction()以及(最具体地说)<signal.h> - 其中表示无法捕获或忽略SIGKILLSIGSTOP。< / p>

OTOH,你说“当我通过命令行杀死它时,我怎么也能这样做”。你打算如何杀死它?假设您在$pid中有PID,那么:

kill $pid

发送SIGTERM信号,您可以通过指定信号来控制发送的信号。 Control-C 键通常发送SIGINT,通常是2号信号。键盘发送的另一个信号为SIGQUIT Control - \ )或各种作业控制信号。

如果您使用:

kill -INT $pid

然后向进程发送中断(SIGINT)(就像kill -2 $pid一样)。默认值相当于kill -TERM $pid。您可以使用以下其中一个发送SIGKILL

kill -KILL $pid
kill -9 $pid

答案 1 :(得分:2)

按control-C时,会发送SIGINT,程序可以捕获 当您使用kill命令时,默认情况下会发送SIGTERM,您的程序也可以捕获该命令 但是你的程序无法捕获或忽略SIGKILL。即使是行为不端的计划,也始终保证能够杀死这一计划。

答案 2 :(得分:0)

阅读signal(7)&amp; sigaction(2)kill(1)(用于命令)和kill(2)(用于系统调用)。

默认情况下,SIGTERM命令会发送kill(例如kill 1234使用kill(2)发送SIGTERM来处理pid 1234)。当然,您可以在kill命令中给出明确的信号,例如kill -QUIT 1234。您可以通过安装适当的信号处理程序来捕获它(例如SIGTERMSIGQUIT)。

当然,你无法捕捉SIGKILL(你可以用kill -KILL 1234命令发送的女巫),所以你不能为它设置一个信号处理程序(即sigaction会给EINVAL }错误)。发送SIGKILL 总是杀死-i.e.终止 - 接收目标流程(并应用于流氓流程)。

关于 Ctrl C ,这是一个与tty-s相关的复杂事情(通常是发送SIGINT信号)。阅读the tty demystified;等等......另见termios(3)&amp; stty(1)

在实践中,习惯于kill首先使用SIGTERM,然后使用SIGQUIT,最后使用SIGKILL。某些进程(例如数据库服务器)需要一些时间来将有用状态保存到磁盘。所以最初不要使用kill -KILL(某些进程可能会对其内部文件的状态不一致,让他们有机会用“温和”信号来管理它)