具体来说,让我们用伪终端术语来说话。假设我们有文件描述符master
和slave
一个伪终端对(假设它是一个控制 tty)。禁用IXON
on master
(或slave
,效果相同)意味着当我们这样做时write(master, &control_s_code, 1)
,read(slave, &byte, 1)
将获得此代码。同样的担忧control_q_code
。问题是:禁用有什么作用IXOFF
?
具体来说,让我们用伪终端术语来说话。假设我们有文件描述符master
和slave
一个伪终端对(假设它是一个控制 tty)。禁用IXON
on master
(或slave
,效果相同)意味着当我们这样做时write(master, &control_s_code, 1)
,read(slave, &byte, 1)
将获得此代码。同样的担忧control_q_code
。问题是:禁用有什么作用IXOFF
?
IXOFF
没有在伪 tty 上实现,并且设置IXOFF
在伪 tty 上没有任何效果。IXOFF
应该导致 tty 驱动程序VSTOP
在其输入队列已满时将一个字符发送到另一端(这应该会阻止它发送更多数据),并VSTART
在它处理完一个字符并且有更多数据的地方时发送一个字符。这与 不同
IXON
,它将导致 tty 驱动程序尊重从另一端发送的VSTART
/VSTOP
字符,并且在接收到VSTOP
(^S
) 字符后,停止任何传输,直到接收到VSTART
(^Q
) 字符。在伪 tty 的情况下,“另一端”是主 pty,例如。你的终端模拟器;当您按 时
^S
,它是,而不是设置将导致从 tty 停止回显输入的字符并显示写入它的数据(将排队直到输出队列已满,当任何从 tty 将阻止或返回)。IXON
IXOFF
write(2)
EAGAIN
不需要在伪 tty 上实现流控制,因为内核总是知道(通过检查结构字段或类似的)从属设备的输入队列是否已满,并且可以阻止进程写入主 pty。
软件流控制仅在使用没有带外信号(如 RTS/CTS)的真正串行连接时才有用:与任何 Unix、TCP 或其他“管道”抽象不同,线路没有缓冲,也不会填满和阻塞,直到接收器已经读取了它的所有状态变化。