gpt4 book ai didi

python - 伪终端master读取刚刚写入的内容

转载 作者:太空狗 更新时间:2023-10-29 20:24:37 25 4
gpt4 key购买 nike

我正在开发一个项目,该项目将使用串行端口连接的“虚拟设备”(python 进程)与也使用串行端口的真实设备连接起来,我正在使用伪终端连接其中的几个(超过 2 个)串行端口通信过程(建模串行设备)在一起,我遇到了一些障碍。

我有一个生成伪终端的 python 进程,将 pty 的从属端符号链接(symbolic link)到一个文件(这样进程就可以为文件名创建一个 pyserial 对象),而主端由我的 pty 生成进程保存并且读;当数据进入一个主机时,数据会被记录下来,然后写入其他主机。如果聆听过程始终存在,则此方法有效。

问题是当虚拟设备死亡或从未启动时(这是该项目的有效用例)。在我的系统上,似乎,如果数据被写入一个 pty 的主端,如果没有任何东西在监听从端,那么在那个主端上调用 read 将返回刚刚写入的数据!这意味着设备不止一次接收相同的数据——不好!

例子:

>>master, slave = pty.openpty()
>>os.write(master,"Hello!")
6
>>os.read(master,6)
'Hello!'

我更希望对 read() 的调用阻塞,直到从设备发送数据。事实上,这是从设备的行为——它可以写入,然后 os.read(slave,1) 将阻塞,直到主设备写入数据。

我的“虚拟设备”需要能够传递一个文件名来打开一个串口对象;我试图对主端进行符号链接(symbolic link),但这会导致我的虚拟设备打开/dev/ptmx,这会创建一个新的伪终端对,而不是链接回已经存在的从设备!

有什么办法可以改变master的行为吗?或者甚至只是获取对应于从属设备(不仅仅是/dev/ptmx)的主控设备的文件名?

提前致谢!

最佳答案

我很确定这是因为默认情况下回显是打开的。向Python termios docs借用,你可以这样做:

master, slave = os.openpty()    # It's preferred to use os.openpty()
old_settings = termios.tcgetattr(master)
new_settings = termios.tcgetattr(master) # Does this to avoid modifying a reference that also modifies old_settings
new_settings[3] = new_settings[3] & ~termios.ECHO
termios.tcsetattr(master, termios.TCSADRAIN, new_settings)

您可以使用以下方法恢复旧设置:

termios.tcsetattr(master, termios.TCSADRAIN, old_settings)

关于python - 伪终端master读取刚刚写入的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6061814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com