这是一个创建于 2197 天前的主题,其中的信息可能已经有所发展或是发生改变。
为了学习 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 只能算“对整体结果有改善”但不是因果关系,偶尔还是会失败。所以看起来这个是操作系统调度多进程方面的问题
但子进程如果不缩短读取长度,在我的尝试里是全部失败的,这个我就想不明白了
2 条回复 • 2018-11-22 10:44:50 +08:00
|
|
1
julyclyde 2018-11-20 14:23:46 +08:00
排版乱了……还好只有一层缩紧,大家努力想象一下
|
|
|
2
lanqing 2018-11-22 10:44:50 +08:00
@ julyclyde 编辑的时候右下有个 default ,选择 makedown 就行了哦~
|