Boost::process async_wait 进程

Bru*_*ano 1 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; 
    } 
} 
Run Code Online (Sandbox Code Playgroud)

抱歉我的英语不好问候布鲁诺

arr*_*hiu 5

我知道这篇文章已经很老了,但它在谷歌中的排名非常高(我也遇到了同样的问题)。文档是错误的 - 整个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();
}
Run Code Online (Sandbox Code Playgroud)