2010-02-18 33 views

Antwort

10

Nun, die anderen Antworten sind meist korrekt.

System, während nicht nur fork s und dann exec s, tut es nicht exec Ihren Prozess, es läuft die Standard-Shell, das Programm als Argument übergeben.

Also, wenn Sie wirklich eine Shell (für Parameter-Parsing und dergleichen) wollen es ist viel effizienter wie etwas zu tun:

int i = fork(); 
if (i != 0) { 
    exec*(...); // whichever flavor fits the bill 
} else { 
    wait(); // or something more sophisticated 
} 
7

Die exec Familie von Funktionen wird den aktuellen Prozess durch einen neuen ersetzen, während system den neuen Prozess abzweigen und dann darauf warten, dass er beendet wird. Welche zu verwenden ist, hängt davon ab, was Sie wollen.

Da Sie dies in einer Schleife tun, denke ich, dass Sie nicht den ursprünglichen Prozess ersetzen möchten. Daher schlage ich vor, dass Sie versuchen, mit system zu gehen.

+1

System unterwirft auch die Linie Linie Parsing-Befehl, der Macht Öffnen Sie Löcher für Injektionsangriffe. – falstro

+0

Ich suchte nach einigen Tutorials im Internet und die meisten Beispiele fork() ed einen neuen Prozess und ersetzt die Gabel mit execvp(). Danach wartete der Elternprozess auf den Abschluss des Kindprozesses. Ist das im Grunde das System()? – helpermethod

+1

Ja, das ist im Grunde das, was 'system()' tut. Das Aufrufen von 'system()' führt auch die Standard-Shell aus und übergibt Ihr Programm als Argument, was etwas mehr Overhead erzeugt. – jschmier

5

Ich würde execvp nur verwenden, wenn ich mit System nicht erreichen kann, was ich will. Beachten Sie, dass Sie, um das Äquivalent des Systems zu erhalten, auch execvp, fork und etwas Signalhandling benötigen.