для определенного класса файловых дескрипторов. Не очень похоже на Unix.

етил несколько странностей, когда имел дело с именованными каналами (FIFO) под различными версиями 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)

Ваш ответ на вопрос