Требуется ли 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
экземпляр и по-прежнему отвечать на завершение дочернего процесса как можно скорее.