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