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

agr*_*zer 7 process

有一段时间,Ctrl+\就像一个魅力。现在,它不会终止进程。事实上它什么都不做。

它如何不起作用的一个例子:

adi@ebi:~ $ sleep 10
^C

[exited with 130]
adi@ebi:~ $ sleep 10
^\^\^\^\^\^\^\^\^\^\^\ 
adi@ebi:~ $
Run Code Online (Sandbox Code Playgroud)

Ctrl+C像往常一样停止睡眠,但Ctrl+\没有,但它应该,对吧?

Bra*_*iam 6

什么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)
Run Code Online (Sandbox Code Playgroud)

如您所见,mplayer 会捕获信号,但不会立即退出。如果我使用了Ctrl+C它会说“MPlayer 被模块中的信号 2 中断:play_audio”。我想解释的是,每个程序都可以按照自己喜欢的方式解释信号,而无需关心它应该做什么。您必须查看文档。另外,请记住,SIGKILL或者9应该作为最后的资源。您必须检查击键是否也发送到进程、键盘映射是否正确以及您的键盘是否已连接。


fal*_*ner 5

您可以通过执行列出您的终端设置

stty -a
Run Code Online (Sandbox Code Playgroud)

它会打印出你的热键,其中“^”代表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;
Run Code Online (Sandbox Code Playgroud)

检查man stty哪个特殊字符做了什么,例如:

quit CHAR
          CHAR will send a quit signal
Run Code Online (Sandbox Code Playgroud)

因此,我的输出中的“ quit = ^\ ”意味着如果我按Ctrl+\它将向进程发送退出信号(SIGQUIT)。如果您的stty -a输出不同,那么您可以设置它

stty quit ^\
Run Code Online (Sandbox Code Playgroud)

或者如果你想要例如Ctrl+K用于 SIGQUIT 信号使用

stty quit ^k
Run Code Online (Sandbox Code Playgroud)

但请注意,除了SIGKILL之外的每个信号都可以被接收进程捕获,因此如果开发人员决定这样做,进程可以忽略它。而且我认为使用Ctrl+ C(SIGINT) 比使用Ctrl+ \(SIGQUIT)更好,因为这两个信号的默认操作是结束进程,但在 SIGQUIT 的情况下也应该进行核心转储,我认为这通常是不需要的.