Frage von gerlochi, 23

Wie starte ich ein Programm in C++?

Hi, ich frage micn, wie ich in C++ (Linux) ein anderes Programm starten kann. Sonnst geht es immer mit system(), aber da geht man den Umweg über die Shell. Ich wollte es gerne direkt Starten. Also ohne umweg, sondern: 'Suche Datei, wenn da, dann führe sie aus!'.

Geht das über ein Stück Assemblercode, gibt es da eine eigene funktion für, oder muss ich system(); verwenden?

Falls ich etwas falsch verstanden habe, weißt mich bitte darauf hin :). Danke.

MfG gerlochi

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von martin7812, Community-Experte für programmieren, 15

In Linux gibt es die Befehle "execv()", "execl()", "execvp()" und "execlp()":

Anwendung von execv():

Du erstellst ein Array aus String-Pointern, in das du die Kommandozeilen-Parameter abspeicherst (einschließlich dem "eingegebenen" Programmname). Der letzte Eintrag ist der NULL-Pointer. Das erste Argument ist der volle Dateiname des Programms, das zweite ist das Array.

Beispiel:

const char *argumente[20];
// Kommandozeile: testprog hello world

argumente[0]="testprog";
argumente[1]="hello";
argumente[2]="world";
argumente[3]=NULL;
execv("/bin/testprog", argumente);

Wenn das Programm tatsächlich existiert (und auch ausgeführt werden kann), dann beendet sich allerdings das Programm, welches "execv()" aufruft, sofort.

Wenn man das nicht will, kann man mit "fork()" ein laufendes Programm "verdoppeln" (so, dass es zwei Mal läuft), so dass nur das zweite Programm beendet wird:

if(fork()==0)
{
execv("/bin/testprog", argumente);
// Hier kommt man nur hin, wenn "testprog"
// nicht ausgeführt werden kann!
// Dafür sorgen, dass das "verdoppelte"
// Programm auf jeden Fall beendet wird
exit(1);
}

Bei der Variante "execl()" gibt man die Argumente direkt an und benötigt kein Array:

 execl("/bin/testprog", "textprog",
"hello", "world", NULL);

("fork()" braucht man aber trotzdem.)

Bei den Varianten "execvp()" und "execlp()" muss man nicht den vollen Dateinamen angeben, sondern "PATH" wird durchsucht...

Leider ist es nicht ganz einfach herauszufinden, ob "execv()" geklappt hat oder nicht.

Kommentar von gerlochi ,

danke!

Antwort
von ralphdieter, 8

martin7812 hat ja schon gezeigt, wie's geht. Ich möchte nur anmerken, dass system() keinen großen "Umweg" geht (wie etwa in anderen Betriebssystemen).

Eine shell läuft sowieso praktisch immer. Und damit kannst Du Umgebungsvariablen, Wildcards, Pipes und andere Goodies nutzen. exec() ist dagegen auf eine einzelne ausführbare Datei beschränkt:

#include <stdio.h>  /* printf() */
#include <stdlib.h> /* system() */
#include <unistd.h>
/* exec..() */

void main(void)
{
printf("*** running system()...\n");
system("sleep .1 && rgrep $USER /etc | wc &");

printf("*** running exec()...\n");
execlp("gunzip", "Un-Zip", "-h", (char*)NULL);
perror("error!\n");
}

Beachte, dass die Ausgabe von system() hier nur wegen "sleep .1" nach der Ausgabe von exec() erscheint. Ohne diese Verzögerung ist system() (zumindest bei mir) schon fertig, bevor exec() loslegt. Sooo langsam kann's also nicht sein.

Keine passende Antwort gefunden?

Fragen Sie die Community