Programmaufrufe innerhalb von C/C++-Programmen

Aufruf von Programmen in Linux und Windows

C und C++ ermöglichen eine maschinennahe Programmierung. Das bedeutet häufig, dass für verschiedene Systeme (z.B. Linux, BSD, Windows...) auch unterschiedlicher Quellcode notwendig ist.
Der Aufruf von anderen Programmen aus einem C/C++-Programm heraus ist ein typisches Beispiel dafür.

Die hier vorgestellten Code-Beispiele sind aus dem Programm silidock entnommen und sind für einen bestimmten Anwendungsfall geschrieben worden: Dem Starten von Programmen durch einen einfachen Button-Klick. Screen Shot Silidock silidock
Die grafische Benutzeroberfläche ist mit dem Toolkit FLTK programmiert, dadurch kann der größte Teil des Programms auf verschiedenen Betriebssystemen kompiliert werden, ohne den Quellcode anpassen zu müssen. Die einzige Ausnahme davon ist der Programmaufruf.

system() - Eine einfache Alternative?
system() macht eigentlich genau das, was hier benötigt wird: Das Aufrufen eines Programms. Die Angelegenheit wäre mit einem einfachen system((const char*) data); erledigt.
system() ist Teil der C-Bibliothek . Die Funktion schickt ein Kommando an das Betriebssystem und wartet, bis dieses Kommando abgearbeitet wurde. Das bedeutet, dass system() auf verschiedenen Betriebssystemen ausgeführt wird, der Extra-Code für jedes Betriebssystem könnte entfallen.
system() bietet jedoch wenig Kontrollmöglichkeiten. Das Hauptprogramm wartet, bis der durch system() aufgerufene Prozess beendet ist. Damit ist die Funktion für den Anwendungsfall hier unbrauchbar: Es könnte immer nur ein Programm durch die Menübar gestartet werden.
Außerdem: system() ruft eine neue Standard-Shell auf um das Programm auszuführen, bzw. CMD.EXE in Windows. Das bedeutet nicht nur eine schlechtere Performance (system() ist langsam), sondern auch ein mögliches Sicherheitsproblem (siehe beispielsweise Do not call system()).

Übersicht