Недавно мне нужно было написать скрипт, который выполняет os.fork() для разделения на два процесса. Дочерний процесс становится серверным процессом и передает данные обратно родительскому процессу, используя канал, созданный с помощью os.pipe(). Дочерний элемент закрывает 'r'
конец канала, а родитель закрывает 'w'
конец канала, как обычно. Я конвертирую возврат из pipe() в файловые объекты с помощью os.fdopen.
Проблема, с которой я сталкиваюсь, заключается в следующем: процесс успешно разветвляется, и ребенок становится сервером. Все отлично работает, и ребенок добросовестно записывает данные в открытый 'w'
конец канала. К сожалению, родительский конец канала делает две странные вещи:
А) Он блокирует операцию read()
на 'r'
конце канала.
Во-вторых, ему не удается прочитать какие-либо данные, которые были помещены в канал, если только 'w'
конец полностью закрыт.
Я сразу подумал, что проблема в буферизации, и добавил вызовы pipe.flush(), но это не помогло.
Может ли кто-нибудь пролить свет на то, почему данные не появляются до тех пор, пока конец записи не будет полностью закрыт? И есть ли способ сделать вызов read()
неблокирующим?
Это моя первая программа на Python, которая разветвлялась или использовала конвейеры, так что простите меня, если я допустил простую ошибку.