2017-08-17 9 views
0

私は2つのプロセス:​​とt2.cppを持っています。pipeコマンドで標準入力が壊れている

​​とt2.cppが簡略化されているため、問題を簡単に説明したいと思います。​​とt2.cppをコンパイルした後

//t1.cpp 
#include <iostream> 
using namespace std; 
int main() 
{ 
    cout << "hello\n" 
     << "world\n" 
     << "ok ok\n"; 
    return 0; 
} 

//t2.cpp 
#include <iostream> 
#include <limits> 
using namespace std; 
int main()                                                  
{ 
    string str; 
    while(getline(cin,str)){ 
     cout << str <<endl; 
    } 

    //cin.clear(); 
    //flush the cin 
    //cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n'); 

    char x; 
    cin >> x; 
    return 0; 
} 

。私はこのようにそれらを実行する./t1 | ./t2

問題が発生します。 cin >> x; in t2.cppが失敗しました。私はキーボードから入力する機会がありません。

パイプコマンドはredirecting the STDIN_FILENOで実装されているようです。同時に標準入力を禁止していますか?

私の厳しい要件を加えて、私はt2 .FOR例では、ユーザーと対話したい、シェルコマンド|t1の出力からデータを取得し、私はSure to del?[y/n],and wait users's anwser.

+2

本当にC++の質問ではありません。 https://unix.stackexchange.com/questions/103885/piping-data-to-a-processs-stdin-without-causing-eof-afterward – LogicStuff

+0

私は正しい答えは "do "しかし、私はそれが何であるか分からない。 '/ dev/tty'から読み込みますか?それでは、私が「less」にパイプしているコマンドに、確実に入力を確実に送ることができますか? –

答えて

0

T value; 
std::cin >> value; 
std::cout << value; 

または(t1がstdoutにそのデータを書き終えた後、標準入力を追加)コメントでシェルコマンドの動作をエミュレートします最後に、我々はstdinまたはstdoutがリダイレクトされたとき、我々はまた、FRを読み書きすることができます「は/ dev/ttyの」

FILE *file = fopen("/dev/tty","r"); 
if(NULL == file){ 
    /*error*/ 
} 
int ch = fgetc(file); 
if('y' == ch || 'Y' == ch){ 
    /*balabala*/ 
} 

を使用してこの問題を対処します/dev/tty

0

を表示していました実は、あなたが行うことができるものがありますされますC++コードで。 t1はstdinから読み込み、それをstdoutにエコーしなければなりません。それはリダイレクトされます。あなたは、様々な場所でこのような何かを行うことができます。

std::copy(std::istreambuf_iterator<char>(std::cin), 
      std::istreambuf_iterator<char>(), 
      std::ostreambuf_iterator<char>(std::cout)); 
+1

これは機能しますが、実際には2つの入力ソースをミキシングするので最適なソリューションではありません。あなたは 't1'から来たものと何がユーザから来たものかを知ることができません。さらに 't1'にパイプすれば、ユーザー入力をもう一度失います。 –

関連する問題