Kann popen () bidirektionale Pipes wie pipe () + fork () erzeugen?

Ich implementiere Piping in einem simulierten Dateisystem in C ++ (meistens in C). Es muss Befehle in der Host-Shell ausführen, aber die Weiterleitung selbst auf dem simulierten Dateisystem ausführen.

Ich könnte dies mit dem @ erreichpipe(), fork(), undsystem() Systemaufrufe, aber ich würde lieber @ verwendpopen() (behandelt das Erstellen einer Pipe, das Forken eines Prozesses und das Übergeben eines Befehls an die Shell). Dies ist möglicherweise nicht möglich, da ich (glaube ich) in der Lage sein muss, vom übergeordneten Prozess der Pipe aus zu schreiben, am Ende des untergeordneten Prozesses zu lesen, die Ausgabe des untergeordneten Prozesses zurückzuschreiben und schließlich die Ausgabe des übergeordneten Prozesses zu lesen. Die Manpage fürpopen() auf meinem System sagt, dass eine bidirektionale Pipe möglich ist, aber mein Code muss auf einem System mit einer älteren Version ausgeführt werden, die nur unidirektionale Pipe unterstützt.

Mit den separaten Aufrufen oben kann ich Pipes öffnen / schließen, um dies zu erreichen. Ist das möglich mitpopen()?

Für ein einfaches Beispiel, um @ auszuführls -l | grep .txt | grep cmds Ich muss einfach

Öffne eine Pipe und starte den Prozessls -l auf dem Host; Lies die Ausgabe zurückPipe die Ausgabe vonls -l zurück zu meinem SimulatorÖffne eine Pipe und starte den Prozessgrep .txt auf dem Host auf der weitergeleiteten Ausgabe vonls -lPipe die Ausgabe von diesem zurück zum Simulator (hier stecken)Öffne eine Pipe und starte den Prozessgrep cmds auf dem Host auf der weitergeleiteten Ausgabe vongrep .txtLeiten Sie die Ausgabe davon zurück zum Simulator und drucken Sie sie aus

man popen

Von Mac OS X:

Daspopen()ie @ -Funktion 'öffnet' einen Prozess, indem eine bidirektionale Pipe erstellt, gegabelt und die Shell aufgerufen wird. Alle durch das vorherige @ geöffneten Streapopen() -Aufrufe im übergeordneten Prozess werden im neuen untergeordneten Prozess geschlossen. Historisch gesehen,popen() wurde mit einer unidirektionalen Pipe implementiert. daher viele Implementierungen vonpopen() lässt nur zu, dass das Argument mode Lesen oder Schreiben angibt, nicht beides. Weilpopen() wird nun mithilfe einer bidirektionalen Pipe implementiert. Das Argument mode fordert möglicherweise einen bidirektionalen Datenfluss an. Das mode-Argument ist ein Zeiger auf eine nullterminierte Zeichenfolge, die zum Lesen 'r', zum Schreiben 'w' oder zum Lesen und Schreiben 'r +' sein muss.

Antworten auf die Frage(10)

Ihre Antwort auf die Frage