2016-08-08 16 views
0

Ich entwickle ein interaktives Programm, das Eingaben vom Benutzer (über stdin) nimmt und Daten entsprechend ausgibt (mit stdout). Während das Programm läuft, muss ich eine Hintergrundanwendung öffnen (und sie laufen lassen, während das Hauptprogramm läuft). Ich habe dies erfolgreich mit popen (mit dem "r" -Modus) gemacht, aber manchmal bekomme ich stdin Konflikte. Wenn der Benutzer beispielsweise eine Eingabe eingibt, die für das Hauptprogramm bestimmt ist, behandelt das Programm dies manchmal als eine Eingabe für das Hintergrundprogramm. Der Benutzer sollte niemals direkt mit dem Hintergrundprogramm interagieren müssen. Gibt es eine Möglichkeit, sowohl die Eingabe als auch die Ausgabe des Hintergrundprogramms von stdin und stdout vollständig zu entkoppeln und trotzdem mit einem Dateideskriptor zum Hintergrundprozess zu lesen und zu schreiben?Wie öffne ich einen Prozess in C++ mit popen ohne Eingabe und Ausgabe an stdin?

+0

Wenn Sie 'popen()' verwenden, können Sie entweder lesen oder schreiben, nicht beides. Wie schreibst du in das Hintergrundprogramm? – Barmar

+0

Err, das ist, was 'popen()' * für * ist. Wenn Sie das nicht wollen, benutzen Sie es nicht. Aber es scheint, dass das, was Sie wirklich brauchen, 'popen()' im Lese-Schreib-Modus ist, so dass die 'stdin' * des Zielprozesses umgeleitet wird, weg von der Konsole. – EJP

Antwort

1

Code genau das, was Sie brauchen. Die Funktion popen ist eine Komfortfunktion, mit der Sie genau das ausführen können, was Sie gerade benötigen. Ansonsten verwenden Sie pipe, fork, dup2, close und was auch immer exec -Familie Funktion Sie wollen.

Sie können es hilfreich finden, ein paar Implementierungen von popen/pclose zu sehen, um zu sehen, wie sie funktionieren. Passen Sie wie erforderlich an.

1

Verwenden Sie einfach nicht popen. Verwenden Sie stattdessen fork + eine der exec Familie von Funktionen, die die Io-Streams nicht verbindet.