Was ist der Unterschied zwischen popen() und system() in C
Lesezeit: 3 Minuten
Syntax-Fehler
Ich möchte eine Binärdatei in meinem C-Code ausführen. Womit lässt es sich besser ausführen? popen() oder system()
BEARBEITEN: Ich habe versucht zu verwenden systemaber der Prozess, der ausgeführt wird, scheint am Ende hängen zu bleiben und kehrt nicht zu meinem Code zurück.
Irgendwelche Vorschläge, was zu tun ist?
Vielen Dank
man popen und man system?
– Irgendein Programmierer-Typ
16. Dezember 2011 um 18:13 Uhr
Hast du es mal mit popen() versucht? oder ist es das problem mit dir binär? Ihre letzte Bearbeitung ist etwas verwirrend
– Henryyao
3. Oktober 2013 um 18:14 Uhr
Benutzen popen Anstatt von system hilft nicht bei Ihrem eigentlichen Problem: Der Prozess bleibt hängen.
– Wolf
23. Januar 2018 um 12:17 Uhr
Kerrek SB
popen() gibt Ihnen die Kontrolle über die Eingabe- oder Ausgabedateiströme des Prozesses. system() nicht. Wenn Sie nicht auf die E/A des Prozesses zugreifen müssen, können Sie verwenden system() der Einfachheit halber.
system() ist in C89 und C99; popen() ist nur Posix (obwohl die Windows-API auch eine hat).
Beide Funktionen rufen eine Form von a auf Hülse um den Befehl auszuführen (z /bin/sh unter Linux, und wahrscheinlich cmd.exe unter Windows). Wenn Sie eine ausführbare Datei direkt ausführen möchten und sich auf Posix befinden, können Sie sich auch die exec*-Familie von Funktionen in Verbindung mit fork() (seit exec()ersetzt der aktuelle Prozess).
@HeathHunnicutt: Ich auch nicht bis vor fünf Minuten, als ich Joachims Rat befolgte 🙂
– Kerrek SB
16. Dezember 2011 um 18:25 Uhr
Wichtiger Hinweis bzgl popen: Es gibt Ihnen die Kontrolle über die Eingabe ODER Ausgabestrom, nicht beides.
– Irgendein Programmierer-Typ
16. Dezember 2011 um 22:24 Uhr
@JoachimPileborg: Sicher. Vielleicht hätte ich “xor” schreiben sollen? Englisch und C sind leider unterschiedlich.
– Kerrek SB
16. Dezember 2011 um 22:32 Uhr
Wenn ich das Rohr fd mit schließe pclosetut pclose gibt den Exit-Wert des Befehls zurück, mit dem ich gefeuert habe popen?
– Strubbl
16. April 2013 um 17:13 Uhr
@Strubbl: Es wird die gleiche Semantik wie für sein waitdh Sie müssen diese Makros verwenden, um herauszufinden, ob der Prozess normal oder per Signal zurückgegeben wurde, und dann wird der Rückgabewert verschoben.
– Kerrek SB
16. April 2013 um 17:54 Uhr
chao
Verwenden popen wenn Sie einen Shell-Befehl ausführen möchten und möchten, dass der übergeordnete Prozess mit dem untergeordneten Prozess sprechen kann. (Es hakt die Ein- oder Ausgabe des Kindes an den Stream, den Sie zurückbekommen.) Andernfalls bevorzugen Sie die exec Familie von Funktionen (wahrscheinlich in Verbindung mit fork); exec‘d-Prozesse erben die meisten offenen Dateideskriptoren (einschließlich stdin, stdout und stderr), sodass Sie Eingaben einhängen können und Ausgabe nach Belieben … außerdem gibt es weniger Auswirkungen auf die Sicherheit.
system wird im Allgemeinen am besten vermieden, es sei denn, Sie müssen Shell-Befehle ausführen. Es erzeugt eine Shell, um den Befehl auszuführen, und die Shell kann den Befehl beliebig parsen. Insbesondere bestimmte Umgebungsvariablen (wie $IFS und/oder $PATH) kann so modifiziert werden, dass der Elternteil Programme ausführt, die Sie nie beabsichtigt haben. Obwohl popen scheint dasselbe zu tun, es bietet zumindest Funktionen, die es im allgemeinen Fall lohnenswert machen.
Du kannst nur tun entweder Eingang oder Ausgabe, glaube ich. popen() spawnt auch eine Muschel.
– Kerrek SB
16. Dezember 2011 um 18:20 Uhr
13716000cookie-checkWas ist der Unterschied zwischen popen() und system() in Cyes
man popen
undman system
?– Irgendein Programmierer-Typ
16. Dezember 2011 um 18:13 Uhr
Hast du es mal mit popen() versucht? oder ist es das problem mit dir binär? Ihre letzte Bearbeitung ist etwas verwirrend
– Henryyao
3. Oktober 2013 um 18:14 Uhr
Benutzen
popen
Anstatt vonsystem
hilft nicht bei Ihrem eigentlichen Problem: Der Prozess bleibt hängen.– Wolf
23. Januar 2018 um 12:17 Uhr