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 秒后关闭管道(准确地说,系统会这样做,因为父级终止)。
请记住,管道是一种设备,而不是文件。这意味着存在读取可以等待新数据的状态。在这种状态下,您可以看到这两个读取函数之间的区别:
- 当
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.
- 当调用
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.
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 秒后关闭管道(准确地说,系统会这样做,因为父级终止)。
请记住,管道是一种设备,而不是文件。这意味着存在读取可以等待新数据的状态。在这种状态下,您可以看到这两个读取函数之间的区别:
- 当
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.
- 当调用
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.