Python:os.read和f.read之间的区别是什么

时间:2018-02-16 08:33:49

标签: python operating-system filesystems

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之后清楚操作系统的操作。如果你能向我推荐一些博客,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

os.read是一个低级系统函数。没有解码,没有缓冲,它只返回给定限制的原始字节。所有其他读取都构建在此函数的顶部,可以重复调用它。他们添加了一些功能,比如将字节解码为字符串,在换行符上拆分文本等。

在你的程序中,父程序发送数据,并在5秒后关闭管道(确切地说,系统会这样做,因为父程序终止)。

请记住,管道是设备,而不是文件。这意味着存在读取可以等待新数据的状态。在这种状态下,您会看到这两个读取函数之间的区别:

  1. os.read在管道中找不到数据时,它会等待数据到达或管道关闭(EOF)。当管道中有一些数据时,它会立即返回。
  2.   

    从文件描述符fd读取最多n个字节。返回一个bytestring   包含读取的字节。如果文件的末尾是由fd引用的   已到达,返回空字节对象。

    1. 如果在没有大小限制的情况下调用f.read,则会等到EOF:
    2.   

      从流中读取并返回最多大小字符作为单个字符   海峡。如果大小为负或无,则读取直至EOF。