import os
from threading import Thread
import time
def handle(fd):
while True:
data=raw_input()
if data:
print('send',data)
os.write(fd,data)
r,w=os.pipe()
pid=os.fork()
if pid==0:
os.close()
os.dup2(r,0)
# f=os.fdopen(r,'r')
print(1)
while True:
# data=f.read()
data=os.read(r,1024)
if data:
print('get',data)
else:
os.close(r)
t=Thread(target=handle,args=(w,))
t.setDaemon(True)
t.start()
time.sleep(5)
print('parent exit')
os._exit(0)
使用os.read时,输出为:
> 1
> dir
> ('send','dir')
> ('get','dir')
> parent exit
使用f.read:
> 1
> dir
> ('send','dir')
> parent exit
> ('get','dir')
显然,子进程在f.read()上阻塞,直到写入结束,这是由父进程引起的。什么导致他们的行为不同?我想在调用f.read和os.read之后清楚操作系统的操作。如果你能向我推荐一些博客,我将不胜感激。
答案 0 :(得分:0)
os.read
是一个低级系统函数。没有解码,没有缓冲,它只返回给定限制的原始字节。所有其他读取都构建在此函数的顶部,可以重复调用它。他们添加了一些功能,比如将字节解码为字符串,在换行符上拆分文本等。
在你的程序中,父程序发送数据,并在5秒后关闭管道(确切地说,系统会这样做,因为父程序终止)。
请记住,管道是设备,而不是文件。这意味着存在读取可以等待新数据的状态。在这种状态下,您会看到这两个读取函数之间的区别:
os.read
在管道中找不到数据时,它会等待数据到达或管道关闭(EOF)。当管道中有一些数据时,它会立即返回。从文件描述符fd读取最多n个字节。返回一个bytestring 包含读取的字节。如果文件的末尾是由fd引用的 已到达,返回空字节对象。
f.read
,则会等到EOF:从流中读取并返回最多大小字符作为单个字符 海峡。如果大小为负或无,则读取直至EOF。