7.11 Kommandoaufrufe aus dem Programm – system()
Mit der Funktion system() können Sie aus Ihrem eigenen Programm ein anderes Programm starten. Damit können Sie alle Aufrufe starten, die Sie sonst auch in der Shell starten können. Außer Kommandos der Shell und anderen Anwendungen sind dabei auch Metazeichen wie '*', '|', '<' oder '>' zu beachten. Ein Dateiname darf aus allen Zeichen mit Ausnahme von '\0' (Stringende) und '/' (Verzeichnisoperator) bestehen. Es können Newlines und sonstige Steuerzeichen vorkommen. Es sind also auch Dateiexpansionen, Pipes, Umleitungen etc. möglich. Die Funktion system() ist eine Mischung aus fork(), exec*() und waitpid() und kann auch dafür eingesetzt werden. Hier die Syntax dazu:
#include <stdlib.h>
int system(const char *kommando);
Beim Aufruf der Funktion wird eine Shell (/bin/sh) in einem eigenen Prozess gestartet und führt kommando aus. Danach wartet system() auf die Beendigung des (Kind-)Prozesses. So lange bleibt der aufrufende Prozess allerdings auch blockiert. Wenn die Shell nicht gestartet werden konnte, wird als Fehler der Wert 127 zurückgegeben. Bei fehlerfreier Ausführung gibt system() 0 zurück, ansonsten den Rückgabewert der Shell. Hierzu ein Beispiel, das mithilfe des system()-Aufrufs im Verzeichnis /usr/include nach allen Dateien sucht, die mit der Zeichenfolge 'std' beginnen.
/* my_find.c */
#include <stdlib.h>
#include <stdio.h>
int main (void) {
printf("Vor dem system()-Aufruf\n");
system("find /usr/include -name 'std*'");
printf("Nach dem system()-Aufruf\n");
return EXIT_SUCCESS;
}
Das Programm bei der Ausführung:
$ gcc -o my_find my_find.c
$ ./my_find
Vor dem system()-Aufruf
/usr/include/g++/ext/stdio_filebuf.h
/usr/include/g++/stdexcept
/usr/include/bits/stdio-lock.h
/usr/include/bits/stdio.h
/usr/include/bits/stdio_lim.h
/usr/include/linux/stddef.h
/usr/include/stdio.h
/usr/include/stdio_ext.h
/usr/include/stdint.h
/usr/include/stdlib.h
Nach dem system()-Aufruf
|