终端内的 ^S 和 ^Z 控制字符有什么区别?

Eug*_*ash 3 signals tty

使用终端仿真器时,可以使用CTRL-Z或停止当前正在运行的程序CTRL-S。这些信号有什么区别?

War*_*ung 10

Ctrl-Z实际上确实停止了当前的前台程序,但它与终端模拟器无关。它由您当前运行的 shell 处理。Unix 的原始 shell 没有此功能,因此您可能会发现在某些系统上缺少它,例如引导到单用户模式的 Linux 的最小嵌入式版本。

Ctrl-S不一定完全停止当前的前台程序。它所做的只是请求操作系统的终端代码暂时停止向您的终端发送数据。该程序实际上仍在运行,并且实际上只要它不填充任何输出缓冲区,它甚至不会在系统调用中被阻塞。该Ctrl-S终端输出暂停功能,是一种古老的事实上的标准可以追溯到电传打字机的日子,并在按照惯例所有Unixy操作系统是支持的,但它可以被禁用(stty -ixon)或反弹到别的东西。例如,文本编辑器和其他交互式程序经常会重新绑定Ctrl-S

您可以看到停止后重新启动方式的进一步差异。Ctrl-Q在 a 之后重新启动终端输出Ctrl-S,而重新启动停止的进程Ctrl-Z需要fg对控制外壳的命令。