当我尝试停止某件事时,我^C
有时会^D
在终端中使用。
这两者有什么区别?为什么有些程序对 没有响应^C
,但^D
。为什么当我使用 时 Terminal.app 就退出了^D
?
答案1
CtrlC告诉终端发送SIGINT
到当前前台进程,默认情况下这意味着终止应用程序。CtrlD告诉终端它应该在标准输入上注册一个 EOF,bash 将其解释为想要退出。
答案2
Ctrl+ D( ^D
) 表示文件结尾。它只在行首起作用(我稍微简化了一下),如果程序没有从终端读取输入,它就没有效果。在您的实验中,^D
告诉 shell 您不会再输入任何命令,因此它退出;然后终端退出,因为它的子程序已经终止。
Ctrl+ C( ^C
) 表示“中断”,即停止你正在做的事情。从技术上讲,按下^C
会发送INT 信号,默认情况下会终止应用程序,但在许多程序中意味着返回到顶层(例如,在 shell 中,停止输入命令行并返回到原始提示符)。
如果程序没有响应^C
,您可以尝试Ctrl+ \( ^\
)。这将发送退出信号,默认情况下会终止应用程序,但很少有程序会拦截它。
另一个发送信号的键是Ctrl+ Z( ^Z
)。它发送TSTP 信号,暂停前台运行的程序。(TSTP 是“终端停止”的缩写;它类似于停止但是 TSTP 可以被忽略,而 STOP 不能。)从 shell 中,您可以使用命令fg
(在前台恢复)或bg
命令(在后台恢复)恢复该程序的执行。
所有这些键都可以用stty
命令。某些程序(尤其是具有键绑定的全屏程序)会禁用它们。
答案3
除了上面两个非常好的答案之外,还有一个例子:
如果您python
在 shell 中输入,它会将您带进入 python 的 >>> 提示符。
现在,如果您点击Ctrl+C
,它会说KeyboardInterrupt
并停留在 >>> 中。
如果您进入 for 循环,例如通过键入,for x in (text):
它会通过显示 ... 提示等待您进一步输入,如果您Ctrl+C
现在点击,它会退出 for 语句并返回到 >>> 提示
如果您Ctrl+D
在任何时候点击,无论是在 >>> 还是 ... 中,它都会退出 python 提示并返回到原始 shell。
类似地,如果通过 ssh 连接到另一台计算机, aCtrl+C
将终止任何现有命令,Ctrl+D
并执行此操作并从该计算机退出。 (此外,密钥Delete
与执行 a 相同Ctrl+D
)
答案4
一些程序包括使用 sigaction 的信号处理,以此来不与子进程通信。当您希望在重要程序的某个进程期间不发送信号时,请选择实现信号处理。这也许可以回答您的问题:为什么您看到一些程序在发送 SIGINT (^c) 信号时不会终止。作为操作系统提供的安全机制的一部分,SIGKILL (^d) 的特殊之处在于它始终会终止程序。