Создать дочерний процесс с пользовательской средой, используя boost - PullRequest
1 голос
/ 09 марта 2019

В документации boost нет примеров создания дочернего процесса в пользовательской среде с использованием process::child(...).
. Пример приведен с process::system(...), но функция system имеет меньше возможных операций (например, pipe или waitpid), поэтому я хотел бы получить полный пример, используя process::child, если это возможно.

1 Ответ

0 голосов
/ 09 марта 2019

в system.hpp, system_impl, который поддерживает пользовательские env, реализован в терминах child,

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)...);
}

переводится в эту функцию, поэтому вы должны быть в состоянии сделать то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...