[英]What is the difference between os.read() and sys.stdin.read() in Python3
[英]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秒鍾后關閉管道(確切地說,由於父級終止,系統會執行此操作)。
請記住,管道是設備,而不是文件。 這意味着當讀取可以等待新數據時處於一種狀態。 在這種狀態下,您會看到這兩個讀取函數之間的區別:
os.read
在管道中找不到任何數據時,它將等待直到數據到達或管道已關閉(EOF)。 當管道中有一些數據時,它將立即將其返回。 從文件描述符fd讀取最多n個字節。 返回包含讀取的字節的字節串。 如果已到達fd引用的文件末尾,則返回一個空字節對象。
f.read
被調用而沒有大小限制時,它將等待直到EOF: 作為單個str從流中讀取並返回最大大小的字符。 如果size為負或無,則讀取直到EOF。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.