为什么 Ctrl+\(反斜杠)不再终止进程?

为什么 Ctrl+\(反斜杠)不再终止进程?

一段时间内,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 中断”。我想解释的是,每个程序都可以按照自己喜欢的方式解释信号,而不必关心它应该做什么。您必须查看文档。另外,请记住,SIGKILL9应该作为最后的资源。您必须检查击键是否也发送到进程,键盘映射是否正确以及您的键盘是否已连接。

相关内容