我正在创建一个程序,我正在以异步方式做最多的事情。
我需要运行一个程序,当这个程序完成时,它会调用一个回调函数。我发现了一个版本的boost :: process并决定使用,但似乎有一个例子,但是在我下载的源代码中找不到实现,有人可以帮我一个忙吗?
代码示例http://www.highscore.de/boost/gsoc2010/process/user_guide.html#boost_process.user_guide.waiting 并在此下载源代码boost :: process www.highscore.de/cpp/process /
我需要为它创建一个实现,但我从错误的地方获取了源代码?
这是解决我问题的示例代码。
boost::asio::io_service ioservice;
void end_wait(const boost::system::error_code &ec, int exit_code);
int main()
{
std::string exe = boost::process::find_executable_in_path("hostname");
std::vector<std::string> args;
boost::process::child c = boost::process::create_child(exe, args);
boost::process::status s(ioservice);
s.async_wait(c.get_id(), end_wait);
ioservice.run();
}
void end_wait(const boost::system::error_code &ec, int exit_code)
{
if (!ec)
{
#if defined(BOOST_POSIX_API)
if (WIFEXITED(exit_code))
exit_code = WEXITSTATUS(exit_code);
#endif
std::cout << "exit code: " << exit_code << std::endl;
}
}
抱歉我的英语不好 关心布鲁诺
答案 0 :(得分:0)
Boost.Process不是官方的Boost库。我可以在this which is two years old之后的作者博客上找不到此库中正在进行的工作的参考。
鉴于预测不确定,我不确定获得代码的“正确位置”在哪里。您可以在Boost forums上询问 - 也许在他们的存储库中有一个当前/正在运行的测试版本,您可以选择。
答案 1 :(得分:0)
我知道这篇文章已经很老了,但是在Google中的排名很高(我也遇到了同样的问题)。文档是错误的-整个boost::process::status
类不存在,并且get_id()
方法实际上是id()
。
这是异步等待进程退出的正确方法
#include <iostream>
#include <boost/asio.hpp>
#include <boost/process.hpp>
#include <boost/process/async.hpp>
#include <boost/process/extend.hpp>
struct MyHandler : boost::process::extend::async_handler {
template <typename ExecutorType>
std::function<void(int, std::error_code const&)> on_exit_handler(ExecutorType&) {
return [](int exit_code, std::error_code const& ec) {
if (ec) {
// handle error
}
#if defined(BOOST_POSIX_API)
if (WIFEXITED(exit_code))
exit_code = WEXITSTATUS(exit_code);
#endif
std::cout << "exit code: " << exit_code << std::endl;
};
}
};
int main()
{
boost::asio::io_service io;
boost::process::child child{"/bin/echo", std::vector<std::string>{"testing"}, MyHandler{}, io};
io.run();
}