2017-08-17 3 views
0

Ich habe zwei Prozesse: t1.cpp und t2.cpp.Rohrbefehl machen Standardeingabe gebrochen

t1.cpp und t2.cpp sind vereinfacht, ich möchte das Problem einfach beschreiben.

//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; 
} 

Nach t1.cpp und t2.cpp kompilieren. Ich führe sie auf diese Weise .

Probleme treten auf! cin >> x; in t2.cpp gescheitert! Ich habe keine Chance von der Tastatur aus zu tippen.

Es scheint, dass der Pipe-Befehl von redirecting the STDIN_FILENO implementiert wird. Verbietet es die Standardeingabe gleichzeitig?

Meine harten Anforderungen ist Befehl zusätzlich |, Daten von dem Ausgang der t1 mit Schale erhalten, ich mit den Nutzern in t2 .Für Beispiel interagieren will, würde ich eigentlich Sure to del?[y/n],and wait users's anwser.

+2

Nicht wirklich eine C++ Frage. https://unix.stackexchange.com/questions/103885/piping-data-to-a-processs-stdin-without-causing-eof-afterward – LogicStuff

+0

Ich denke, die richtige Antwort ist "do "Aber ich weiß nicht, was das ist. Liest es aus '/ dev/tty'? Wie kommt es, dass ich Eingaben zuverlässig an jeden Befehl senden kann, den ich an "weniger" anschließe? –

Antwort

0

Schließlich beschäftigen wir dieses Problem mit "/ dev/tty"

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

wenn stdin oder stdout umgeleitet wurde, können wir auch fr lesen oder schreiben om die /dev/tty.

0

anzuzeigen, gibt es etwas, was Sie tun können im C++ Code. t1 muss von stdin lesen und echo das zu stdout, die umgeleitet wird. Sie können an verschiedenen Orten so etwas tun:

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

Oder das Verhalten der Shell-Befehl in den Kommentaren zu emulieren (anhängen stdin nach t1 seine Daten an stdout Schreiben beendet hat):

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

Das kann funktionieren, ist aber nicht wirklich die beste Lösung, weil es die beiden Eingangsquellen mischt; Sie können nicht sagen, was von 't1' kam und was vom Benutzer kam. Plus, wenn Sie in "t1" pipen, verlieren Sie die Benutzereingabe wieder. –