簡體   English   中英

Python: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()上一直阻塞,直到由父進程的退出導致寫結束關閉為止。是什么原因導致它們的不同行為?我想在調用f.read和os之后弄清操作系統的操作。讀。 如果您能向我推薦一些博客,我將不勝感激。

os.read是低級系統功能。 沒有解碼,沒有緩沖,它只是返回原始字節直到給定的限制。 所有其他讀取均建立在此函數的頂部,並且可能會反復調用它。 它們添加了一些功能,例如將字節解碼為字符串,在換行符上分割文本等。

在您的程序中,父級發送數據,並在5秒鍾后關閉管道(確切地說,由於父級終止,系統會執行此操作)。

請記住,管道是設備,而不是文件。 這意味着當讀取可以等待新數據時處於一種狀態。 在這種狀態下,您會看到這兩個讀取函數之間的區別:

  1. os.read在管道中找不到任何數據時,它將等待直到數據到達或管道已關閉(EOF)。 當管道中有一些數據時,它將立即將其返回。

從文件描述符fd讀取最多n個字節。 返回包含讀取的字節的字節串。 如果已到達fd引用的文件末尾,則返回一個空字節對象。

  1. f.read被調用而沒有大小限制時,它將等待直到EOF:

作為單個str從流中讀取並返回最大大小的字符。 如果size為負或無,則讀取直到EOF。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM