为什么在Linux中两次按Ctrl + c会停止正在运行的进程?


24

有些Linux程序(例如vlc)建议两次输入ctrl+ c,以终止从终端执行的程序,前提是该程序在第一个程序之后没有停止。

为什么第一次输入无效时,键入ctrl+ c两次会起作用?


6
[需要引用]
Ignacio Vazquez-Abrams

Answers:


35

它所做的完全是特定于应用程序的。当您按ctrl+时c,终端仿真器将SIGINT信号发送到前台应用程序,这将触发相应的“信号处理程序”。SIGINT的默认信号处理程序将终止应用程序。但是任何程序都可以为SIGINT安装自己的信号处理程序(包括一个根本不会停止执行的信号处理程序)。

显然,vlc安装了一个信号处理程序,该信号处理程序在第一次被调用时尝试进行一些清理/正常终止,并退回到默认行为,即在第二次被调用时立即终止执行。


3
在某些系统上,调用处理程序后,信号将恢复为SIG_DFL(以避免在同一信号上两次调用处理程序);这称为SysV语义。许多程序不会在信号处理程序的末尾将信号处理程序设置回原始的程序设置。这通常是编程错误。阅读有关signal(2)联机帮助页的更多信息。
Arcege”

16

SIGINT(由Ctrl+ 发出的信号)C通常告诉程序进入其主命令处理循环,或者在没有意义的情况下干净地退出。某些程序在收到SIGINT时将运行清理过程。如果程序太混乱而导致清理过程失败,则在某些程序中,第二秒Ctrl+ C会使程序立即退出。这样做取决于每个程序作者。

如果第二个Ctrl+ C不杀死该程序,尝试Ctrl+ \,它发送SIGQUIT,更猛烈的(但仍然开捕信号)或尝试Ctrl+ Z暂停程序,随后的kill命令(例如kill %1,它发送SIGTERM,以往不太剧烈信号比SIGQUIT高1号)。如果一切都失败了,杀与程序kill -KILL,也被称为kill -9,发送抓不到信号SIGKILL

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.