我一直在努力书写和阅读管道。问题是,一方面,我正在处理通过open()
获得的文件对象中的管道。另一方面,我使用的是由“低级” os.open()
获得的文件描述符。尽管看起来相似,但代码的行为却大不相同,我也不十分清楚为什么。
我举了一个小例子。我正在改变写入管道的方法。在 write_1.py 中,我使用os.open()
,一切正常。在使用open()
的 write_2.py 中,当从管道中读取时,出现 EAGAIN 错误,并且仅当使用{{ 1}}。
两种情况下的阅读方式相同,请参见 read.py 。 您能解释一下不同的行为吗?
(Python版本3.5.2)
pipe.close()
# write_1.py
import os
import errno
import time
bufferSize = 100
PATH = "pipe"
i = 0
pipe = os.open(PATH, os.O_WRONLY | os.O_NONBLOCK)
while i < 20:
i +=1
my_str = "written {0}-times".format(i)
try:
input = os.write(pipe, my_str.encode())
except OSError as err:
if err.errno == 11:
print("error 11")
continue
else:
raise err
if input:
print("written {0} chars ".format(input))
print("Sleep 500 ms")
time.sleep(0.5)
os.close(pipe)
# write_2.py
import os
import errno
import time
bufferSize = 100
PATH = "pipe"
i = 0
pipe = open(PATH, "w")
fd = pipe.fileno()
fl = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
while i < 20:
i +=1
my_str = "written {0}-times".format(i)
try:
input = pipe.write(my_str)
except OSError as err:
if err.errno == 11:
print("error 11")
continue
else:
raise err
if input:
print("written {0} chars ".format(input))
print("Sleep 500 ms")
time.sleep(0.5)
pipe.close()
答案 0 :(得分:2)
使用open
,您已经接受了默认的缓冲设置(不提供buffering
参数),因此您将获得一个缓冲的文件对象。此缓冲区与任何操作系统级缓冲区都是分开的。
对于os.open
,没有文件对象,也没有文件对象级别的缓冲。
(此外,您还使用open
以阻塞I / O模式打开了管道,但这并不是造成差异的原因。)