Boost :: process async_wait process - PullRequest
       0

Boost :: process async_wait process

1 голос
/ 30 сентября 2010

Я создаю программу и делаю все возможное асинхронно.

Мне нужно запустить программу, и когда эта программа завершает ее, она вызывает функцию обратного вызова.Я нашел версию 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 ]

2 голосов
/ 05 декабря 2018

Я знаю, что этот пост уже довольно старый, но в 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();
}
0 голосов
/ 30 сентября 2010

Boost.Process не является официальной библиотекой Boost.Я не могу найти ссылки на незавершенную работу над этой библиотекой в ​​блоге автора позже, чем это два года .

Я не уверен, где находится «правильное место» для получения кода с учетом этого неопределенного прогноза.Вы можете спросить на форумах Boost - возможно, в их хранилище есть текущая / рабочая тестовая версия, которую вы можете подобрать.

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