2008-11-20 10 views

Antwort

12

System verwendet auch eine fork/exec ... Kombination. Wenn Sie fork/exec selbst ausführen, können Sie parallel zu Ihrem laufenden Prozess ausführen, während system blockiert (enthält die wait). Auch system führt den Befehl nicht direkt, sondern über eine Shell (die Probleme mit Setuid Bit macht) und system blockiert/ignoriert bestimmte Signale (SIGINT, SIGCHILD, SIGQUIT).

6

Ja, system() führt den Befehl über eine Shell aus, während exec() den Befehl direkt ausführt. Natürlich öffnet sich die Einführung einer Shell für Bugs und Exploits.

Bearbeiten: natürlich bietet mehr Details.

+0

„Einführung einer Schale nach oben für Bugs und Exploits öffnet“ - Nur wenn Sie eine Person erlauben, die Befehle eingeben. Wenn Ihre Anwendung den Text des Shell-Befehls generiert, besteht keine Möglichkeit eines Exploits. –

+0

Eine Möglichkeit ist, wenn der Benutzer einige Shell-Variablen ändert, bevor der Code ausgeführt wird. Es gibt eine Möglichkeit zu nutzen, aber nicht sicher, wie generisch es ist. – foo

+0

Sie haben auch Pfad/Linker-Tricks. [Die Links brechen: Den Linker ausnutzen] (http://www.nth-dimension.org.uk/pub/BTL.pdf). – jww

3

System() funktioniert unter Windows, aber fork() nicht.

Es sei denn, Sie verwenden eine Kompatibilitätsschicht wie Cygwin, aber selbst dann kann eine Gabel sehr teuer sein.

+0

die Frage ist mit Linux/Unix getaggt, so eine Windows-Antwort ist nicht so hilfreich ... –

+1

@Nathan, die Frage erwähnt Portabilität Unterschiede, die das ist. – finnw

+0

Ich habe eine Frage zum Thema Kosten, wie ist Gabel teurer als System. System gibt auch einen Prozess ab, stattdessen gibt es zwei Prozesse ab. – foo

2

gibt es auch popen(), die wie System(), erlaubt aber ein Kinder Ausgang zu lesen und liefern Eingangs

5

system() wird fork()/exec() die Schale, und dann wird Shell fork()/exec() das Programm Sie wollen starten.

So ist system() doppelt so schwer wie fork()/exec()

Verwandte Themen