![为什么 Ctrl+\(反斜杠)不再终止进程?](https://linux22.com/image/841508/%E4%B8%BA%E4%BB%80%E4%B9%88%20Ctrl%2B%5C%EF%BC%88%E5%8F%8D%E6%96%9C%E6%9D%A0%EF%BC%89%E4%B8%8D%E5%86%8D%E7%BB%88%E6%AD%A2%E8%BF%9B%E7%A8%8B%EF%BC%9F.png)
一段时间内,Ctrl+\运行良好。现在,它不会终止进程。事实上,它什么也不做。
举个例子说明它是如何不起作用的:
adi@ebi:~ $ sleep 10
^C
[exited with 130]
adi@ebi:~ $ sleep 10
^\^\^\^\^\^\^\^\^\^\^\
adi@ebi:~ $
Ctrl+C像往常一样停止睡眠,但是Ctrl+\没有,但它应该停止睡眠,对吗?
答案1
您可以通过执行以下命令列出终端设置
stty -a
它将打印出你的热键,其中“^”代表Ctrl,例如我的是:
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O;
检查man stty
哪个特殊字符的作用例如:
quit CHAR
CHAR will send a quit signal
所以 ”退出 = ^\“在我的输出中意味着如果我按下Ctrl+\它将发送一个退出信号(信号退出)到进程。如果你的stty -a
输出不同,那么你可以用
stty quit ^\
或者如果你想要使用例如Ctrl+K作为 SIGQUIT 信号
stty quit ^k
但请注意,除了终止信号可以被接收进程捕获,因此如果开发人员决定这样做,进程可以忽略它。而且我认为使用Ctrl+ (SIGINT) 比使用+ (SIGQUIT)C更好,因为这两个信号的默认操作都是结束进程,但在 SIGQUIT 的情况下还应该进行核心转储,我认为这通常是不希望的。Ctrl\
答案2
Ctrl+所做\的就是将事件发送SIGQUIT
到前台进程。有些开发人员希望以用户可能不期望或不习惯的方式使用 SIG* 事件。您没有提到程序,但让我们看看我使用Ctrl+\和 的情况mplayer
:
AO: [pulse] 44100Hz 2ch floatle (4 bytes per sample)
Video: no video
Starting playback...
A: 1.7 (01.7) of 0.0 (unknown) 0.4%
// here I press Ctrl + \
MPlayer interrupted by signal 3 in module: play_audio
A: 1.0 (00.9) of 0.0 (unknown) 0.4%
Exiting... (Quit)
如您所见,mplayer 捕获了信号,但不会立即退出。如果我使用Ctrl+,C它会说“MPlayer 被模块 play_audio 中的信号 2 中断”。我想解释的是,每个程序都可以按照自己喜欢的方式解释信号,而不必关心它应该做什么。您必须查看文档。另外,请记住,SIGKILL
或9
应该作为最后的资源。您必须检查击键是否也发送到进程,键盘映射是否正确以及您的键盘是否已连接。