Я просто использую Boost.Process, но пример кода, с которым я работаю, может быть полезен.
boost :: process: async_system () принимает 3 параметра: a boost :: asio :: io_context объект, функция обработчика выхода и команда, которую вы хотите запустить (точно так же как system (), и это может быть либо одна строка, либоболее одного аргумента).
После его вызова вы используете объект io_context из вызывающего потока для управления и мониторинга асинхронной задачи - я использую метод run_one (), который будет "Выполнять цикл обработки событий объекта io_contextвыполнить не более одного обработчика ", но вы также можете использовать другие методы для выполнения в течение некоторого времени и т. д.
Вот мой рабочий код:
#include <boost/process.hpp>
#include <iostream>
using namespace boost;
namespace {
// declare exit handler function
void _exitHandler(boost::system::error_code err, int rc) {
std::cout << "DEBUG async exit error code: "
<< err << " rc: " << rc <<std::endl;
}
}
int main() {
// create the io_context
asio::io_context ioctx;
// call async_system
process::async_system(ioctx, _exitHandler, "ls /usr/local/bin");
std::cout << "just called 'ls /usr/local/bin', async" << std::endl;
int breakout = 0; // safety for weirdness
do {
std::cout << " - checking to see if it stopped..." << std::endl;
if (ioctx.stopped()) {
std::cout << " * it stopped!" << std::endl;
break;
} else {
std::cout << " + calling io_context.run_one()..." << std::endl;
ioctx.run_one();
}
++breakout;
} while (breakout < 1000);
return 0;
}
Единственное, чего не хватает в моем примере, это какиспользуйте boost :: asio :: async_result для захвата результата - примеры, которые я видел (в том числе здесь, на slashdot), все еще не имеют большого смысла для меня, но, надеюсь, это очень полезно.
Вотвывод вышеперечисленного на мой ссистема:
just called 'ls /usr/local/bin', async
- checking to see if it stopped...
+ calling io_context.run_one()...
- checking to see if it stopped...
+ calling io_context.run_one()...
VBoxAutostart easy_install pybot
VBoxBalloonCtrl easy_install-2.7 pyi-archive_viewer
((omitted - a bunch more files from the ls -l command))
DEBUG async exit error code: system:0 rc: 0
- checking to see if it stopped...
* it stopped!
Program ended with exit code: 0