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

Python:what's the differece between os.read and f.read

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() 上阻塞,直到父进程 withdrawal.What 导致的写结束关闭导致它们的不同行为?我想弄清楚操作系统的调用 f.read 和 os.read 后的操作。如果您能给我推荐一些博客,我将不胜感激。

os.read 是一个 low-level 系统函数。没有解码,没有缓冲,它只是 returns 个达到给定限制的原始字节。所有其他读取都建立在这个函数之上,并且可能会重复调用它。他们添加了一些功能,例如将字节解码为字符串、在换行符上拆分文本等。

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

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

  1. os.read发现管道中没有数据时,它会等待直到数据到达或管道关闭(EOF)。当管道中有一些数据时,它会立即 returns 它。

Read at most n bytes from file descriptor fd. Return a bytestring containing the bytes read. If the end of the file referred to by fd has been reached, an empty bytes object is returned.

  1. 当调用 f.read 时没有大小限制,它会等到 EOF:

Read and return at most size characters from the stream as a single str. If size is negative or None, reads until EOF.