使用管道时open()与os.open()的行为

时间:2019-05-02 11:45:25

标签: python named-pipes

我一直在努力书写和阅读管道。问题是,一方面,我正在处理通过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()

1 个答案:

答案 0 :(得分:2)

使用open,您已经接受了默认的缓冲设置(不提供buffering参数),因此您将获得一个缓冲的文件对象。此缓冲区与任何操作系统级缓冲区都是分开的。

对于os.open,没有文件对象,也没有文件对象级别的缓冲。

(此外,您还使用open以阻塞I / O模式打开了管道,但这并不是造成差异的原因。)