我刚刚开始使用 Boost.Process,但我工作的示例代码在这里可能会有所帮助。
boost::process:async_system () 有 3 个参数:一个boost::asio::io_context对象,一个退出处理函数,以及你想要运行的命令(就像system (),它可以是单行或多个 arg)。
调用后,您可以使用调用线程中的 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