UNIX/Mac OS X 终端的 ^C 和 ^D 有什么区别?

UNIX/Mac OS X 终端的 ^C 和 ^D 有什么区别?

当我尝试停止某件事时,我^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) 的特殊之处在于它始终会终止程序。

相关内容