Boost :: process async_wait进程

时间:2010-09-30 04:27:31

标签: c++ boost

我正在创建一个程序,我正在以异步方式做最多的事情。

我需要运行一个程序,当这个程序完成时,它会调用一个回调函数。我发现了一个版本的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; 
    } 
} 

抱歉我的英语不好 关心布鲁诺

2 个答案:

答案 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();
}