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?
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%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:
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.
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%