为什么从两个连接的 pty 读取会导致无限循环?

为什么从两个连接的 pty 读取会导致无限循环?

我想伪造一个 gsm 调制解调器来测试程序。我希望程序向我发送 AT 代码,并且我可以回复它,有点像虚拟串口。但由于某种原因,从程序写入的数据被直接写回其中。

我本以为 socat 创建了两个管道;一个将测试程序的输出发送到我在另一侧连接的任何东西,另一个管道在另一个方向工作。但如果你明白我的意思的话,数据似乎是“在一根管道中循环”。这是一张来自TTY 揭秘来说明我的观点:

内核中的 Pty 处理

简化的复制脚本:

我使用以下命令创建 pty:

(xterm 1)$ socat -d -d -d PTY,link=foo PTY,link=bar
2012/01/18 14:45:01 starting loop with FDs [3,3] and [5,5]

我听双方的意见:

(xterm 2)$ cat <bar
(xterm 3)$ cat <foo

如果我写几个字...

(xterm 4)$ echo "..." > foo

..socat 记录一个很多无限地往返的交通。

(xterm 1)
2012/01/18 14:25:58 socat[7667] I transferred 4095 bytes from 5 to 3
2012/01/18 14:25:58 socat[7667] I transferred 4095 bytes from 3 to 5
2012/01/18 14:25:58 socat[7667] I transferred 4095 bytes from 5 to 3
2012/01/18 14:25:58 socat[7667] I transferred 4095 bytes from 3 to 5
2012/01/18 14:25:58 socat[7667] I transferred 4095 bytes from 5 to 3
2012/01/18 14:25:58 socat[7667] I transferred 4095 bytes from 5 to 3

这两个 cat 命令都没有输出任何内容。

编辑:@wnoise 解释说 socat 创建了两个 PTY 主控。这是一张图片来说明这一点:

通过 socat 连接的两个 PTY 主设备

答案1

您使用的语法创建两个 pty master 并将它们双向连接在一起。因为您没有echo=0在选项中添加“”,所以您不断收到回声。可能还需要raw根据您的用例添加。

相关内容