Требуется ли wait() после run() в дочернем процессе асинхронного процесса boost?

Я использую Boost Process в асинхронном режиме, чтобы получить stdout, stderr и код возврата команды оболочки. В приведенном ниже фрагменте кода это вызов c.wait() требуется? В соответствии с Boost Process 1.68 Документация не требуется, где, как это требуется в соответствии с boost process 1.65.1,

std::string command = "ls";
boost::asio::io_service ios;
std::future<std::string> dataOut;
std::future<std::string> dataErr;
bp::child c(command, bp::std_in.close(), bp::std_out > dataOut, bp::std_err > dataErr, ios);
ios.run();
c.wait();
stdOut = dataOut.get();
stdErr = dataErr.get();
returnStatus = c.exit_code();

Теперь я использую Boost 1.68 и когда я удаляю вызов c.wait() Я получаю returnStatus из 127 вместо ожидаемого 0, который я получаю, когда добавляю c.wait() вызов. Какая разница звонить c.wait() делать?

1 ответ

Да, run() обычно ожидает завершения асинхронных операций.

Тем не менее, вы могли бы иметь альтернативное прекращение run()

  • когда исключение исходит от обработчика
  • когда другой поток вызывает stop()
  • когда асинхронные сигналы изменяют ход программы

В таких случаях было бы целесообразно по-прежнему использовать wait() так что вы избегаете зомби. Кроме этого, on_exit() Обработчик является более гибким подходом, поскольку он позволяет вам объединять несколько процессов в одном io_context / io_service экземпляр и по-прежнему отвечать на завершение дочернего процесса как можно скорее.

Другие вопросы по тегам