字符未能从主伪终端传输到从伪终端

4 投票
1 回答
622 浏览
提问于 2025-04-16 05:17

我现在正在尝试通过pexpect发送二进制数据。出于某种原因,数据都能正常发送,唯独0x04这个数据被跳过了。我追踪了pexpect的调用,发现实际上只是对通过pty.fork()命令打开的文件描述符进行了os.write()调用。

有没有什么想法?

(示例代码,展示了这个问题)

import os, pty, sys


pid, child_fd = pty.fork()

if pid: # Parent
    os.write(child_fd, b"'\x04hmm\x04'\n")
    buf = os.read(child_fd, 100)
    print buf
else:   # Child
    text = sys.stdin.readline()
    print ''.join(["%02X " % ord(x) for x in text])

结果:

$ python test.py
'hmm'
27 68 6D 6D 27 0A

1 个回答

2

0x04是一个特殊的字符,表示文件结束的按键。你有没有把pty(伪终端)设置成原始模式?也许驱动程序在处理这个按键时出现了问题。

如果你这样做:

os.write(child_fd, b"'\x04hmm\x16\x04'\n")

你会发现驱动程序确实在进行转换。\x16和^V是一样的,这个按键用来引用其他字符。这样说是有道理的,因为转换只会发生在主端(也就是假装的物理终端)和从端之间。假装的物理终端就是正常终端设备上,用户输入的地方。

我不太确定怎么让驱动程序停止这种转换。如果子进程把它的终端设置为原始模式,那可能就能解决这个问题。

撰写回答