pty 咋用?

2018-11-20 14:21:53 +08:00
 julyclyde
为了学习 pty.fork(),尝试写了下面的程序:
import os
import pty
import sys

(pid, fd)=os.forkpty()

if pid==0: #child
sys.stdout.write(sys.stdin.read(1024)[::-1])
else: #parent
print "parent running"
os.write(fd, "msg from parent to child")
print os.read(fd,1024)


结果发现,最后一行 os.read 读入的居然是刚刚 write 出去的字符串
也就是子进程并没有读到主进程发来的字符串
这是什么原因呢?

改进的程序如下:
import os
import pty
import sys
import time

(pid, fd)=os.forkpty()

if pid==0: #child
sys.stderr.write(sys.stdin.read(10)[::-1])
sys.stderr.flush()
else: #parent
print "parent running"
print os.read(fd,0)
os.write(fd, "msg from parent to child\n")
time.sleep(1)
print os.read(fd,1024)

主进程写过之后 sleep 一下再读;子进程读取较短的字节数,就可以成功了
经过多次尝试,主进程写之后、读之前的 sleep 只能算“对整体结果有改善”但不是因果关系,偶尔还是会失败。所以看起来这个是操作系统调度多进程方面的问题

但子进程如果不缩短读取长度,在我的尝试里是全部失败的,这个我就想不明白了
1761 次点击
所在节点    Python
2 条回复
julyclyde
2018-11-20 14:23:46 +08:00
排版乱了……还好只有一层缩紧,大家努力想象一下
lanqing
2018-11-22 10:44:50 +08:00
@julyclyde 编辑的时候右下有个 default ,选择 makedown 就行了哦~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/509599

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX