2017-05-29 5 views
2

文字列のあるプロセスをBoost-1.64.0でstdinに呼び出そうとしています。 現在のコードは次のようになります。boost :: process子のstdinを閉じる

bp::opstream inStream ; 
    bp::ipstream outStream; 
    bp::ipstream errStream; 

    bp::child child(
    command, // the command line 
    bp::shell, 
    bp::std_out > outStream, 
    bp::std_err > errStream, 
    bp::std_in < inStream); 


    // read the outStream/errStream in threads 

    child.wait(); 

問題は、子の実行可能ファイルは、その標準入力のEOFを待っていることです。ここでchild.wait()は無限にぶら下がっています...

私はasio :: buffer、std_in.close()を使用しようとしました。 私が見つけた唯一のハックはinStreamを削除することでした...そしてそれは本当に信頼できるものではありません。

子プロセスを「通知」し、新しいboost :: processライブラリで標準入力を閉じるにはどうしたらよいですか?

ありがとうございます!

+0

_ "delete()inStream" _とはどういう意味ですか?それは私にとってはあまり意味がありません。 – sehe

答えて

2

私はstd_in.close()

これは動作しますが、バッファ:: ASIOを使用してみました。もちろん、起動関数(bp :: childコンストラクタ、bp :: systemなど)に渡すだけで動作します。

データを渡して閉じなければならない場合は、関連するファイル記述子を閉じるだけです。 inputは、プロセスが実際に出力を送信して立ち往生していないことを確認し、また

bp::async_pipe input(ios); 

ある

boost::asio::async_write(input, bp::buffer(_stdin_data), [&input](auto ec, auto bytes_written){ 
    if (ec) { 
     logger.log(LOG_WARNING) << "Standard input rejected: " << ec.message() << " after " << bytes_written << " bytes written"; 
    } 
    may_fail([&] { input.close(); }); 
}); 

:私はこのような何かを!出力の消費に失敗した場合、バッファが満杯になるとバッファリングされ、待機します。

+0

あなたは私の週を保存しました。私はmay_failが例外のカスタムハンドラだと思いますので、input.close()を直接呼び出します。そしてあなたはios.run()も呼び出さなければなりません:) – Salamandar

+0

Yup!今回は不完全なコードをコピーして申し訳ありません:(http://paste.ubuntu.com/24701992/ – sehe

1

書き込みが完了したらinStream.close();を呼び出してパイプを閉じます。​​で起動している間に閉じることもできます。

もちろん、asioソリューションも動作し、デッドロックの危険を回避します。

関連する問題