我觉得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。这是一直保证能够杀死一个行为不端的程序。
- 1. C程序不会终止
- 2. 被阻止的系统调用不会让SIGKILL终止进程
- 3. C++应用程序不会终止
- 4. Nodejs程序不会终止
- 5. 程序不会终止 - Java
- 6. C++程序终止
- 7. C程序终止
- 8. 程序挂起,线程不会终止
- 9. 使用kill(SIGKILL,$$)可以终止睡眠的Perl程序吗?
- 10. SIGKILL以外的信号在Windows上不终止进程
- 11. 我的应用程序不会终止
- 12. 程序不会执行或终止
- 13. 使用休眠程序不会终止
- 14. 外部程序不会终止
- 15. 程序,不终止
- 16. 程序意外终止C++
- 17. C程序意外终止
- 18. 线程不会终止
- 19. mtTkinter不会终止线程
- 20. 过程不会终止
- 21. 当“ctrl c”用于终止程序时程序不停止
- 22. C套接字发送()不会发送,直到程序终止
- 23. 第二次scanf不会运行,程序只是终止。 C
- 24. Bluecove&JavaFX - >应用程序线程不会被终止/停止
- 25. C++ Linux Binary以信号SIGKILL终止 - 为什么? (在GDB加载)
- 26. C语言:孩子不会退出,也不会终止,也不会终止我的父母进程
- 27. 应用程序不终止
- 28. Pydev程序不断终止
- 29. 线程终止问题(C):最后线程不终止
- 30. clearInterval不会终止
'^ C'不发送'SIGKILL'。使用'kill -KILL'命令发送 –
当你说“kill命令什么都不做”时,你使用的命令到底是什么,这个过程究竟发生了什么? – dbush