我认为sigkill
始终有效吗?我的程序中有一个信号处理程序,当你按Ctrl-C时会显示一个退出提示。这工作正常,但是当我通过命令行终止时,我如何使它工作?现在kill命令什么都不做。有没有什么我应该在我的代码中实现杀死工作?
答案 0 :(得分:3)
您无法为SIGKILL
设置信号处理程序。
您的流程无法回复SIGKILL
。它是单方面立即终止的;这个过程不能做任何清理。 O / S释放分配给它的资源,就像它对任何其他死进程一样。
请参阅POSIX Signal Concepts和sigaction()
以及(最具体地说)<signal.h>
- 其中表示无法捕获或忽略SIGKILL
和SIGSTOP
。< / 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
。您可以通过安装适当的信号处理程序来捕获它(例如SIGTERM
或SIGQUIT
)。
当然,你无法捕捉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
(某些进程可能会对其内部文件的状态不一致,让他们有机会用“温和”信号来管理它)