Почему блок именованного канала открывается только для чтения?


Я заметил несколько странностей при работе с именованными трубами (FIFOs) под различными вкусами UNIX (Linux, FreeBSD и MacOS X) с использованием Python. Первый и, возможно, самый раздражающий заключается в том, что попытки открыть пустой/простой FIFO только для чтения будут блокироваться (если я не использую os.O_NONBLOCK с нижним уровнем os.open() звонок). Однако, если я открою его для чтения / записи, то я не получаю блокировки.

примеры:

f = open('./myfifo', 'r')               # Blocks unless data is already in the pipe
f = os.open('./myfifo', os.O_RDONLY)    # ditto

# Contrast to:
f = open('./myfifo', 'w+')                           # does NOT block
f = os.open('./myfifo', os.O_RDWR)                   # ditto
f = os.open('./myfifo', os.O_RDONLY|os.O_NONBLOCK)   # ditto

мне просто любопытно, почему. Почему блок открытого вызова а не какая-то последующая операция чтения?

также я заметил, что неблокирующий файловый дескриптор может проявляться в разных поведениях в Python. В том случае, когда я использую os.open() С os.O_NONBLOCK для начальной операции открытия тогда os.read() кажется, возвращает пустую строку, если данные не готовы на дескриптор файла. Однако, если я использую fcntl.fcnt(f.fileno(), fcntl.F_SETFL, fcntl.GETFL | os.O_NONBLOCK) затем os.read вызывает исключение (errno.EWOULDBLOCK)

есть ли какой-то другой флаг, установленный нормальным open() это не моя os.open() пример? Чем они отличаются и почему?

1 55

1 ответ:

это просто так, как это определено. На странице открыть группу для open() функции

O_NONBLOCK

    When opening a FIFO with O_RDONLY or O_WRONLY set: If O_NONBLOCK is
    set:

        An open() for reading only will return without delay. An open()
        for writing only will return an error if no process currently
        has the file open for reading.

    If O_NONBLOCK is clear:

        An open() for reading only will block the calling thread until a
        thread opens the file for writing. An open() for writing only
        will block the calling thread until a thread opens the file for
        reading.