Цепные процессы с использованием каналов в Boost.Process - PullRequest
0 голосов
/ 16 апреля 2020

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

В качестве минимального примера, давайте предположим, что я хочу реализовать то, что будет echo "Hello, world!" | cat | cat в bash.

Мой код:

#include <boost/process.hpp>
#include <string>

namespace bp = boost::process;

int
main( )
{
    const std::string content = "Hello, world!\n";

    bp::pipe pipe1;
    bp::pipe pipe2;
    bp::child child1( bp::search_path( "cat" ), ( bp::std_in < pipe1 ), ( bp::std_out > pipe2 ) );
    bp::child child2( bp::search_path( "cat" ), ( bp::std_in < pipe2 ) );

    pipe1.write( &content[ 0 ], content.size( ) );
    pipe1.close( );

    child1.wait( );  // this call never finishes
    child2.wait( );

    return 0;
}

Данные, кажется, переданы правильно, и я вижу "Привет, мир!" в терминале. Тем не менее, программа никогда не завершается, поскольку вызов child1.wait( ) никогда не возвращается.

Это на Linux (Ubuntu 19.10) с использованием boost 1.69.

Что я делаю неправильно? Спасибо за любую помощь!

...