Как получить вывод из дочернего процесса 'STDOUT без блокировки или опроса

0

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

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

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

Теги:
pipe
parent-child

1 ответ

2
Лучший ответ

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню