Hallo,
system("/bin/ls");
system() ist ANSI C und ruft den Befehl mit Hilfe der System-Shell auf. Die Dateideskriptoren werden vererbt (d.h. Standardausgabe des aufgerufenen Programms ist die eigene Standardausgabe etc.), es wird gewartet, bis der Befehl vollständig ausgeführt wird. Der Befehl wird in einem separaten Prozess ausgeführt.
execl("/bin/ls", "ls", "-l", NULL);
Das ist unter POSIX (also Linux, Solaris, *BSD, Mac OS X, ...) sowie unter Windows verfügbar - die exec*-Funktionen ersetzen (!) den Inhalt des aktuellen Prozesses mit dem des neuen Prozesses, d.h. nach einem erfolgreichen exec* wurde der eigene Prozess komplett übernommen, d.h. es wird danach kein Code mehr ausgeführt.
spawnl(P_WAIT, "/bin/ls", "-l", NULL);
Das ist nur unter Windows verfügbar und erzeugt einen separaten Prozess (/bin/ls gibt's unter Windows nicht, d.h. Dein Beispiel würde nicht funktionieren), der je nach Flag im ersten Parameter synchron (es wird gewartet, bis der Prozess sich beendet hat) oder asynchron (die Kontrolle wird sofort zurückgegeben) ausgeführt wird.
Manchmal mit Rückgabewert, manchmal ohne. Zur Frage:
Gibt es noch weitere Funktionen?
Unter Windows gibt's noch CreateProcess() (direkter Kernelaufruf) und ShellExec() oder ShellExecute() (in shell32.dll, schlag nach, welche von beiden Varianten die richtige ist, ich hab's vergessen). Unter POSIX gibt's noch die Möglichkeit, per Kombination aus fork() + exec() + waitpid() Prozesse auszuführen, die den aktuellen Prozess *nicht* ersetzen. (so funktioniert system() intern auf POSIX-Betriebssystemen)
Welche würdet ihr verwenden? Wie sähe eine saubere Lösung aus?
Wenn Du möglichst portabel arbeiten willst, dann empfehle ich Dir system(), sofern Dir die Funktionalität und die Kontrolle ausreicht. Das nimmt Dir eine Menge arbeit ab, ist auf allen relevanten Betreibssystemen vorhanden (die auszuführenden Befehle sind nur anders) und gibt Dir den Rückgabewert auch direkt zurück.
Ansonsten wäre unter Windows vmtl. spwan* die Variante Deiner Wahl, während Du Dir unter POSIX-Betriebssystemen wohl eine eigene fork() + exec*() + waitpid() Lösung bauen willst, um (wie Du es vorhast), den Rückgabewert zu erhalten.
Beachte eines noch: Unter POSIX-Betriebssystemen solltest Du system() *nicht* einsetzen, wenn Du Programme schreibst, die setuid-root sind. Dann empfiehlt sich wirklich ein eigener fork() + exec() + waitpid()-Ansatz.
Wenn Du etwas näher beschreiben würdest, was für ein Programm Du in welchem Zusammenhang ausführen willst, kann man Dir vielleicht auch eine spezifische Empfehlug für die eine oder andere Methode geben.
Viele Grüße,
Christian