sigkill不会终止C程序
我觉得sigkill
总是有效吗?我的程序中有一个信号处理程序,当您按下Ctrl-C时会显示一个退出提示。这工作正常,但我怎么也让我的工作,当我通过命令行杀死?现在kill命令什么都不做。有没有什么我应该在我的代码中实现杀死工作?sigkill不会终止C程序
你不能设置信号处理程序SIGKILL
。您的过程没有机会回复SIGKILL
。单方面立即终止;该过程不能做任何清理。 O/S释放分配给它的资源,就像它对其他任何死过程一样。
见POSIX Signal Concepts和sigaction()
,并且(最特别)<signal.h>
- 它说,SIGKILL
和SIGSTOP
不能被捕获或忽略。
OTOH,你说“当我通过命令行杀死它的时候,我该如何做到这一点”。你打算如何杀死它?假设你已经在PID中$pid
,则:
kill $pid
发送SIGTERM
信号,并且可以控制该信号是通过指定它发送。键通常发送SIGINT
,通常是2号信号。从键盘发送的另一个信号是SIGQUIT
(Control- \)或各种作业控制信号。
如果你使用:
kill -INT $pid
然后发送中断(SIGINT
)的过程(如将kill -2 $pid
)。缺省值相当于kill -TERM $pid
。你会送SIGKILL
与之一:
阅读& sigaction(2)和kill(1)(该命令),并kill(2)(系统调用)。
默认情况下,SIGTERM
由kill
命令(例如kill 1234
正在发送SIGTERM
,使用kill(2),向PID 1234处理)发送。当然,您可以在您的kill
命令中给出明确的信号,例如kill -QUIT 1234
。您可以通过安装适当的信号处理程序来捕捉它(例如,SIGTERM
或SIGQUIT
)。
当然,你不能赶上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
在第一个(一些流程可能有不一致的状态,他们的内部文件,让他们有机会来管理一个“温和”的信号)
当你按下Control-C,发送SIGINT,该程序可以赶上。
当您使用kill
命令时,它将默认发送SIGTERM,您的程序也可以捕获它。
但是你的程序不能捕捉或忽略SIGKILL。这是一直保证能够杀死一个行为不端的程序。
'^ C'不发送'SIGKILL'。使用'kill -KILL'命令发送 –
当你说“kill命令什么都不做”时,你使用的命令到底是什么,这个过程究竟发生了什么? – dbush