使用Boost使用自定义环境创建子进程

时间:2019-03-09 03:06:26

标签: c++ boost boost-process

文档boost没有提供使用process::child(...)在自定义环境中创建子进程的任何示例。
process::system(...)给出了一个示例,但是函数system具有较少的可能操作(例如管道或waitpid),因此,如果可能的话,我想使用process::child给出完整的示例。

2 个答案:

答案 0 :(得分:1)

最后一个答案和评论已经很旧了,但我可以确认带有环境参数的 boost::process::child 在 Ubuntu 18.04 下使用 Boost 1.65 版有效。关于那个的文档很薄,所以我必须自己找出来:

std::string command = "/usr/bin/something";
ipstream pipe_stream;

// Get current env
auto env = boost::this_process::environment();
// Add something
env["CHINESE_FOOD"] = "GOOD";
// Change something
env["CHINESE_FOOD"] = "GREAT";
// Delete something
env["CHINESE_FOOD"].clear();

boost::process::child childProc(command, env, std_out > pipe_stream);

当然,如果不需要环境,它会自动从父进程继承

std::string command = "/usr/bin/something";
ipstream pipe_stream;

boost::process::child childProc(command, std_out > pipe_stream);

答案 1 :(得分:0)

在system.hpp中,支持自定义环境的system_impl是根据子项

实现的
template<typename IoService, typename ...Args>
inline int system_impl(
        std::true_type, /*needs ios*/
        std::true_type, /*has io_context*/
        Args && ...args)
{
    IoService & ios = ::boost::process::detail::get_io_context_var(args...);

    system_impl_success_check check;

    std::atomic_bool exited{false};

    child c(std::forward<Args>(args)...,
            check,
            ::boost::process::on_exit(
                [&](int, const std::error_code&)
                {
                    ios.post([&]{exited.store(true);});
                }));
    if (!c.valid() || !check.succeeded)
        return -1;

    while (!exited.load())
        ios.poll();

    return c.exit_code();
}

因此从文档中调用系统:

bp::system("stuff", bp::env["VALUE_1"]="foo", bp::env["VALUE_2"]+={"bar1", "bar2"});

调用:

template<typename ...Args>
inline int system(Args && ...args)
{
    typedef typename ::boost::process::detail::needs_io_context<Args...>::type
            need_ios;
    typedef typename ::boost::process::detail::has_io_context<Args...>::type
            has_ios;
    return ::boost::process::detail::system_impl<boost::asio::io_context>(
            need_ios(), has_ios(),
            std::forward<Args>(args)...);
}

翻译成这个函数,所以你应该可以做到。