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