2016-03-05 81 views
0

我觉得sigkill总是有效吗?我的程序中有一个信号处理程序,当您按下Ctrl-C时会显示一个退出提示。这工作正常,但我怎么也让我的工作,当我通过命令行杀死?现在kill命令什么都不做。有没有什么我应该在我的代码中实现杀死工作?sigkill不会终止C程序

+0

'^ C'不发送'SIGKILL'。使用'kill -KILL'命令发送 –

+4

当你说“kill命令什么都不做”时,你使用的命令到底是什么,这个过程究竟发生了什么? – dbush

回答

3

你不能设置信号处理程序SIGKILL。您的过程没有机会回复SIGKILL。单方面立即终止;该过程不能做任何清理。 O/S释放分配给它的资源,就像它对其他任何死过程一样。

见POSIX Signal Conceptssigaction(),并且(最特别)<signal.h> - 它说,SIGKILLSIGSTOP不能被捕获或忽略。


OTOH,你说“当我通过命令行杀死它的时候,我该如何做到这一点”。你打算如何杀死它?假设你已经在PID中$pid,则:

kill $pid 

发送SIGTERM信号,并且可以控制该信号是通过指定它发送。键通常发送SIGINT,通常是2号信号。从键盘发送的另一个信号是SIGQUITControl- \)或各种作业控制信号。

如果你使用:

kill -INT $pid 

然后发送中断(SIGINT)的过程(如将kill -2 $pid)。缺省值相当于kill -TERM $pid。你会送SIGKILL与之一:

​​
0

阅读​​& sigaction(2)kill(1)(该命令),并kill(2)(系统调用)。

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

当然,你不能赶上SIGKILL(女巫你可以用kill -KILL 1234命令发送),所以你不能为它设置一个信号处理器(即sigaction会给EINVAL错误)。发送SIGKILL始终为杀死 - 即,终止 - 接收目标进程(并应用于流氓进程)。

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

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

2

当你按下Control-C,发送SIGINT,该程序可以赶上。
当您使用kill命令时,它将默认发送SIGTERM,您的程序也可以捕获它。
但是你的程序不能捕捉或忽略SIGKILL。这是一直保证能够杀死一个行为不端的程序。