Linux 3.0: Ausführen eines untergeordneten Prozesses mit piped stdin / stdout

8

Unter Linux 3.0 / C ++:

Ich möchte eine Funktion, die Folgendes tut:

%Vor%

Offensichtlich funktioniert das Obige nicht, aber Sie bekommen die Idee. Ich habe eine Zeichenfolge s, die ich als Standard-Eingabe eines untergeordneten Prozesses Ausführung der Anwendung "foo" übergeben möchte, und dann möchte ich seine Standardausgabe auf String r aufzeichnen und dann zurückgeben.

Welche Kombination von Linux-Syscalls oder Posix-Funktionen sollte ich verwenden?

    
Andrew Tomazos 23.02.2012, 01:45
quelle

3 Antworten

32

Der von Eerpini bereitgestellte Code funktioniert nicht wie geschrieben. Beachten Sie, dass zum Beispiel die Rohrenden verwendet werden, die im Elternteil geschlossen sind. Schau dir

an %Vor%

und das nachfolgende Schreiben in diesen geschlossenen Deskriptor. Dies ist nur Transposition, aber es zeigt, dass dieser Code noch nie benutzt wurde. Unten ist eine Version, die ich getestet habe. Leider habe ich den Code-Stil geändert, daher wurde dies nicht als Bearbeitung von Eerpinis Code akzeptiert.

Die einzige strukturelle Änderung besteht darin, dass ich die E / A nur im Kind umleite (beachte, dass die dup2-Aufrufe nur im untergeordneten Pfad sind). Dies ist sehr wichtig, weil sonst die E / A des Elternteils durcheinander kommt. Danke an Eerpini für die erste Antwort, mit der ich diese entwickelt habe.

%Vor%     
Ammo Goettsch 11.10.2012, 12:26
quelle
2

Da Sie einen bidirektionalen Zugriff auf den Prozess wünschen, müssten Sie tun, was popen hinter den Kulissen explizit mit Pipes macht. Ich bin mir nicht sicher, ob sich das in C ++ ändert, aber hier ist ein reines C-Beispiel:

%Vor%

Effektiv machen Sie das:

  1. Erstellen Sie pipes und leiten Sie stdout und stdin an die Enden der beiden Pipes um (Beachten Sie, dass in linux, pipe () unidirektionale Pipes erzeugt, daher müssen Sie für Ihren Zweck zwei Pipes verwenden).
  2. Exec startet jetzt einen neuen Prozess, der die Enden der Pipes für stdin und stdout enthält.
  3. Schließen Sie die unbenutzten Deskriptoren, schreiben Sie die Zeichenfolge in die Pipe und lesen Sie dann, was der Prozess an die andere Pipe ausgeben könnte.

dup () wird verwendet, um einen doppelten Eintrag in der Dateideskriptortabelle zu erstellen. Während dup2 () ändert, worauf der Deskriptor verweist.

Hinweis: Wie von Ammo @ in seiner Lösung erwähnt, ist das, was ich oben angegeben habe, mehr oder weniger eine Vorlage, es wird nicht ausgeführt, wenn Sie gerade versucht haben, den Code auszuführen, da offensichtlich eine exec * (Familie von Funktionen) fehlt , so wird das Kind fast sofort nach der Gabelung () enden.

    
eerpini 23.02.2012 03:09
quelle
1

Der Code von Ammo enthält einige Fehler bei der Behandlung von Fehlern. Der Child-Prozess kehrt nach einem Dup-Fehler zurück, anstatt zu beenden. Vielleicht können die Kinddoppel durch ersetzt werden:

%Vor%     
James Schmidt 14.01.2014 17:26
quelle

Tags und Links