2017-08-31 16 views
3

私はブーストプロセスライブラリを使いこなしています。しかし、いくつかの理由から、私は標準入力に何かを送信するために管理することはできません。子プロセスのstdinに書き込む

#include <iostream> 
#include <boost/process.hpp> 
using namespace boost::process; 

int main(int argc, char** argv) { 
    boost::asio::io_service ios; 

    std::future<std::string> outdata; 
    std::future<std::string> errdata; 

    child c("/usr/bin/cat", 
      std_out > outdata, 
      std_err > errdata, 
      std_in < "hi, there!", ios); 

    ios.run(); 
    std::cout << "stdout: " << outdata.get() << std::endl; 
    std::cerr << "stderr: " << errdata.get() << std::endl; 
} 

私は、これは、本質的に

echo "hi, there" | cat 

のように動作するように期待したいが、出力は空です。私は何が欠けていますか?

答えて

1
std_in < "hi, there!" 

"hi、there!"という名前のファイルを開きます。それを子の標準にパイプします。

は比較:Live On Coliru

#include <iostream> 
#include <boost/process.hpp> 
using namespace boost::process; 

int main() { 
    boost::asio::io_service ios; 

    std::future<std::string> outdata; 
    std::future<std::string> errdata; 

    child c("/bin/cat", 
      std_out > outdata, 
      std_err > errdata, 
      std_in < "main.cpp", ios); 

    ios.run(); 
    std::cout << "stdout: " << outdata.get() << std::endl; 
    std::cerr << "stderr: " << errdata.get() << std::endl; 
} 

は、独自のソースコードを出力します。またboost::process::bufferの使用を参照してください:(?)

Live On Coliru

あなたは明らかにstdinはバッファを送信AFTE閉じていることを確認する必要があるが

#include <iostream> 
#include <boost/process.hpp> 
#include <boost/process/async.hpp> 
using namespace boost::process; 

int main() { 
    boost::asio::io_service ios; 

    std::future<std::string> outdata; 
    std::future<std::string> errdata; 

    async_pipe in(ios); 
    child c("/bin/cat", 
      std_out > outdata, 
      std_err > errdata, 
      std_in < in, ios); 

    std::string greeting("hi, there!"); 
    boost::asio::async_write(in, buffer(greeting), [&](boost::system::error_code, size_t) { 
       in.close(); 
      }); 

    ios.run(); 
    std::cout << "stdout: '" << outdata.get() << "'\n"; 
    std::cerr << "stderr: '" << errdata.get() << "'\n"; 
} 

プリント

stdout: 'hi, there!' 
stderr: '' 
+0

ありがとうございました。それはAPIのドキュメントにありますが、私はそれを完全に誤解してしまいました.... – choeger

関連する問題