Как получить вывод из дочернего процесса 'STDOUT без блокировки или опроса - PullRequest
0 голосов
/ 07 сентября 2010

У меня есть долго работающее консольное приложение Sender, которое отправляет простой текст в STDOUT, используя небуферизованный вывод, такой как cout << "Message" << flush().Я хочу создать диалоговое приложение MFC (с именем Receiver), которое запускает Sender и может читать его вывод.Receiver также должен уметь определять, когда Sender умер, или иметь возможность убить Sender, если захочет.Sender ничего не знает о Reciever, и я не могу изменить код Sender.

Моей первой попыткой было создание каналов с перенаправленными STDIN и STDOUT для дочернего процесса и использование асинхронных вызовов ReadFileEx.читать данные Sender.Это не работает правильно, и Я разместил отдельную ветку об этих конкретных проблемах.

Мой вопрос: как мне это сделать, в общих архитектурных терминах?Я не хочу, чтобы основной цикл Receiver блокировал или опрашивал, но должен использовать некоторую разновидность Функция ожидания .

1 Ответ

2 голосов
/ 07 сентября 2010

У вас есть 2 основных варианта. Вариант 1, который вы уже попробовали, выполняя асинхронный (или неблокирующий) ввод-вывод для чтения / записи из дочернего процесса. Вариант 2 - создать отдельный поток в процессе Receiver, который блокирует чтение / запись от / в дочерний процесс.

Я бы порекомендовал вариант 2, мне гораздо проще. Тогда у вас, конечно, возникает проблема, как получить данные из вспомогательного потока в основной поток. Для этого вам нужно использовать замки и, возможно, семафоры. Однако это должно быть меньше хлопот, чем неблокирующий ввод-вывод.

...