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.
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 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()).