Требуется ли wait () после выполнения run () в асинхронном дочернем процессе процесса boost? - PullRequest
0 голосов
/ 01 октября 2018

Я использую 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 Ответ

0 голосов
/ 01 октября 2018

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

Однако вы могли бы иметь альтернативное завершение run()

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

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

...