猿问

无法从外部进程读取 PTY(伪终端文件)

我正在打开一个 PTY(在 Python/Linux 中)并写入它。我可以通过minicom完美读取它。但是,我无法在另一个 Python(或 C++)程序中读取它。这是一个最小化的例子:


producer.py(打开 pty / 写入):


import os, sys

from time import sleep

master_fd, slave_fd = os.openpty()

print "minicom -D %s" % os.ttyname( slave_fd )

for i in range(0,30): 

    d = str(i % 10)

    os.write( master_fd, d )

    sys.stdout.write( d )

    sys.stdout.flush()

    sleep( 2 )

os.close( slave_fd )

os.close( master_fd )

print "\nDone"    

consumer.py(尝试打开/读取):


import os, sys

from time import sleep

pts=raw_input("Enter pts number:")

while True:

    fd=0

    try:

        fd=os.open('/dev/pts/%d' % (pts,), 

            os.O_RDONLY | os.O_NONBLOCK )

        sys.stdout.write( os.read(fd, 1 ) )  

        sys.stdout.flush()       

    except Exception as e: print e

    if fd: os.close(fd)    

    sleep(1)        

读取的结果总是:


[Errno 11] 资源暂时不可用


如果我以阻塞模式阅读,它只会阻塞直到生产者终止。然后,它说该文件不存在。


我花了几天时间摆弄尝试设置各种模式、权限、锁定等,但似乎没有任何帮助。这种事情很容易与常规文件一起使用。另外,再次注意minicom 可以毫无障碍地读取 pty。此外,使用lsof我可以看到 minicom 和我的 consumer.py 脚本确实打开了文件 - 这只是在 python 示例中不起作用的读取。那么minicom的秘密是什么?我试图在 minicom 源代码中找到这样的东西,但我没有找到任何我可以使用的东西。


理想情况下,我的制作人会使其易于打开和阅读(就像在我的消费者示例中一样),但是如果我能看到这项工作,我愿意修改任何一端......


RISEBY
浏览 235回答 2
2回答
随时随地看视频慕课网APP

相关分类

Python
我要回答