为何cat读取其他终端时丢字节,Golang Scan函数却不会?
Linux伪终端(pty)下cat与Golang读取机制的差异问题
问题场景
操作步骤:
- 打开两个伪终端(
/dev/pts/0和/dev/pts/1) - 在第二个终端执行
cat /dev/pts/0,使第一个终端的输入内容同步显示在第二个终端 - 在第一个终端(TUI界面)输入内容
多数情况下运行正常,但偶尔会出现字符丢失的现象:未在第二个终端显示的字符会在源终端回显,成功显示的字符则不会在源终端回显,看起来像是终端回显机制和cat进程在争抢输入字符。例如输入字符串Hello world, what are you doing,源终端最终显示el od eyn,目标终端显示Hlowrl,what ar ou doig。
Golang读取的正常表现
使用Golang的fmt包Scan函数读取/dev/pts/0时,输入的内容会被完整读取,且输入内容会在TUI中正常回显,完全不存在字符争抢丢失的情况。示例代码如下:
package main import "fmt" func main() { var input string fmt.Println("Enter text:") for { fmt.Scanln(&input) fmt.Println("You wrote:", input) } }
核心疑问
期望两种读取场景的行为一致:既能完整读取所有输入字节,又能保持一致的回显状态。想明确以下两点:
cat和Golang Scan函数读取伪终端的机制差异是什么?- 为什么
cat读取其他终端时会偶尔丢字节,而Golang的Scan函数却不会?原本以为Golang读取/dev/pts/0的方式和cat是一致的。
内容的提问来源于stack exchange,提问作者Yakog
相关产品推荐
相关产品推荐

