2016-09-26 3 views
2

Ich habe eine ausführbare Datei in Linux, die mit stdin/stdout interagieren kann. Ich versuche, ein Programm in C++ zu schreiben, das dieses Programm interaktiv aufrufen, Befehle an seine Standardeingabe senden und seine Standardausgabe erfassen kann.C++ Linux Interact Ein anderes Programm stdin/stdout

Ich bin wirklich verwirrt worden. Ich möchte mein Programm nicht abzweigen (tue ich?). Ich möchte, dass mein Programm in der Lage ist, den "Client" zu starten, Daten zu senden, Ausgaben zu erhalten, mehr Daten zu senden, mehr Ausgaben zu erhalten, ... und den "Client" zu schließen.

P.S. Ja, ich bin mir sicher, dass dies schon einmal gefragt wurde, aber ich habe ein paar Stunden damit verbracht, mich am Kopf zu kratzen - wahrscheinlich nicht mit den richtigen Schlüsselwörtern.

+0

Möchten Sie dies mit Low-Level-Systemaufrufen schreiben oder können Sie Bibliotheken verwenden? Eine Option ist die Verwendung von [libexpect] (http://docs.activestate.com/activetcl/8.5/expect/libexpect.3.html) –

+0

@MarkPlotnick Es ist ein persönliches Projekt, also ist alles, was dies einfacher macht, der richtige Weg . – CircuitGuy

+0

@MarkPlotnick Eigentlich ja, das funktioniert wirklich gut! Ich habe auf den Aufruf von exp_popen() aus tcl8.6 umgeschaltet. Dies öffnet einen Prozess und gibt ein Dateihandle zurück, von dem ich wie jede andere Datei lesen/schreiben kann. – CircuitGuy

Antwort

3

Die einzige Möglichkeit, ein anderes Programm auszuführen, ist über einen der Systemaufrufe exec(). Das ist der einzige Weg. Und, wie Sie wissen, ersetzt exec() das ausführende Programm durch das Programm, das von exec() angegeben wird. Der Prozess, der die exec() ausgegeben hat, wird nicht mehr existieren, es ist PID wird jetzt von dem neuen Programm verwendet.

Es folgt logisch, dass, wenn Sie möchten, dass Ihr Programm durch diese andere ausführbare Datei ersetzt wird, muss Ihr Programm fork(), und der untergeordnete Prozess verwendet exec(), um die neue ausführbare Datei auszuführen. Dies ist der traditionelle Weg, um einen neuen Prozess zu starten und den ursprünglichen Prozess fortzusetzen. Hierfür ist eine fork() erforderlich.

  1. Verwenden Rohr(), um zwei Rohre, eine für die verrohrt stdin,:

    Die Situation, die Sie beschreiben ziemlich typisch ist, Lack-by-the-Zahlen Situation unzählige Male getan hat, wurde eine für die piped stdout.

  2. Verwenden Sie die Gabel(). Der untergeordnete Prozess dup2() ist das Leseende der stdin-Pipe auf 0, das Schreibende der stdout-Pipe auf 1, schließt beide Enden jeder der ursprünglichen Pipes und exec() ist der neue Prozess.

  3. Der übergeordnete Prozess schließt das Leseende der stdin-Pipe, das Schreibende der stdout-Pipe, und interagiert anschließend mit dem untergeordneten Prozess mit dem Schreibende der stdin-Pipe und dem Leseende der stdout-Pipe.

+0

Sehr gute Erklärung. Du füllst die Stücke aus, die mir bei meinen Recherchen über den Kopf gingen. Abgesehen davon scheint dies eine schreckliche Schnittstelle zu sein, die vor langer Zeit ersetzt und abstrahiert worden wäre. Danke für die Hilfe! – CircuitGuy

+0

@CircuitGuy Windows macht das besser, ob Sie es glauben oder nicht. (Sie rufen 'CreateProcess' auf und übergeben einfach die Handles, die der untergeordnete Prozess für stdin und stdout verwenden soll) – immibis

Verwandte Themen