当我运行时,apt upgrade
我不小心向该终端窗口发送了一个Ctrl- 。S
现在我知道了XOFF
,,XON
- ,以及一些关于电传打字机的新东西Ctrl。Q
当我向“暂停”终端发送一个Ctrl-时,继续其工作。Qapt
通过阅读XOFF
,我不清楚apt
在接收到 的任何命令中发生了什么,或者通常会发生什么XOFF
。htop
停止更新显示,这是一件好事,但仍在htop
运行?
还在apt
跑吗?或者实际上被apt
暂停htop
、冻结了?
显然,进程仍然可以接收输入,而XOFF
'd,因此它们仍在执行。
怎么了?例如,程序计数器,显然它并不是简单地停止增加程序计数器、冻结程序。
它是否取决于命令如何编程来处理 XOFF?基本 Linux 命令是否存在可以预期的一般行为?
笔记那这类似的问题不包含我的问题的答案,因为它们没有提到程序本身发生的情况。例如,我不知道是否apt
继续默默运行,或者是否被冻结/暂停。
答案1
您可能已经知道,XON
和XOFF
,默认情况下绑定到Ctrl+S和Ctrl+ Q,是软件流量控制人物和原则上的遗物纸质打印电传终端的旧时代。当接收设备(通常是纸质打印机)有时无法跟上远程发送器发送的输入时,就会使用它们。
如今,纸质电传打字机已不再使用,但其背后的想法仍然保留在“终端”的软件框架中(参见例如这里和这篇关于 TTY 历史的非常好的文章),它继承并仍然实现了原始纸质终端中使用的一些概念 - 其中之一是解释流量控制字符的能力。
通常,“在控制台上”运行的程序(即连接到伪终端)不会看到XON
和XOFF
字符,因为它们默认由终端捕获,其中标准行为XOFF
是停止打印输出从程序接收。程序本身不受影响,并继续在后台运行,只是输出不会“转发”给用户,直到XON
再次收到。
如果您编写程序并希望显式接收这些输入字符,则可以tcsetattr()
在程序中使用系统调用通过标志禁用软件流控制IXOFF
(请参阅在这里,例如)--nano
这样做, 例如。
答案2
htop
停止更新显示,这是值得知道的事情,但htop
仍在运行[输入 Ctrl-S 后]?
是的,一点没错。htop
或其他命令不会被 Ctrl-S 停止或冻结。
termiosIXON
设置不像ISIG
.键入VSTOP
(Ctrl-S) 或VSTART
(Ctrl-Q) 字符不会向终端中运行的进程发送任何信号。
检查起来很容易;打开两个终端:在第一个输入
tail -f /tmp/file
在第二个
cat > /tmp/file
现在,在第二个终端中键入 Ctrl-S,然后继续盲目键入行,然后按 Enter。它们将出现在第一个终端的屏幕上。如果不是cat
shell 并且这些命令是类似 的命令rm ...
,那么它们将运行而无需在屏幕上回显。
在接收到 XOFF 的任何命令中通常会发生什么。
该命令不“接收 XOFF”。这一切都在终端驱动程序内部处理。从应用程序的角度来看,什么也没有发生。如果程序不断发送大量输出(或者ECHO
termios 设置处于默认状态,并且它不断接收大量输入),则任何对终端的写入(或相应的读取)都会在某个时刻被阻止,直到收到 Ctrl-Q。