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

pro*_*eek 91 terminal terminal.app

当我试图停止某些事情时,我^C有时会^D在终端中使用。

两者有什么区别?为什么有些程序不响应^C,但是^D. 为什么 Terminal.app 在我使用时就退出了^D

Ign*_*ams 82

CtrlC告诉终端向SIGINT当前前台进程发送 a ,默认情况下转换为终止应用程序。CtrlD告诉终端它应该在标准输入上注册一个 EOF,bash 将其解释为希望退出。


Gil*_*il' 82

Ctrl+ D( ^D) 表示文件结束。它只在一行的开头起作用(我稍微简化了一点),如果程序没有从终端读取输入,则不起作用。在你的实验中,^D告诉 shell 你不会再输入任何命令,所以它退出了;然后终端退出,因为它的子程序已经终止。

Ctrl+ C( ^C) 表示“中断”,即停止正在执行的操作。从技术上讲,按下会^C发送INT 信号,默认情况下会终止应用程序,但在许多程序中这意味着返回顶层(例如,在 shell 中,停止输入命令行并返回原始提示)。

如果程序没有响应^C,您可以尝试Ctrl+ \( ^\)。这会发送QUIT 信号,默认情况下会终止应用程序,并且不会有太多程序拦截。

另一个发送信号的键是Ctrl+ Z( ^Z)。它发送TSTP 信号,暂停在前台运行的程序。(TSTP 是“终端停止”的缩写;它类似于STOP,但 TSTP 可以被忽略而 STOP 不能。)在 shell 中,您可以使用fg命令(在前台恢复)或bg命令(在前台恢复)来恢复该程序的执行背景)。

所有这些键都可以用stty命令更改。某些程序,尤其是具有按键绑定的全屏程序,会禁用它们。

  • 一个小的修正:Control-Z 发送 TSTP(终端停止)信号。这可以被进程捕获或忽略,而 STOP 信号则不能。 (3认同)
  • 只是一个关于 CTRL-D 的建议:它的意思是“刷新我到目前为止输入的输入”,如果该行为空,则 read() 返回零,这被解释为“文件结尾”。 (2认同)