Почему блок именованного канала открывается только для чтения?
Я заметил несколько странностей при работе с именованными трубами (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 ответ:
это просто так, как это определено. На странице открыть группу для
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.