SYSTEM(3)

BEZEICHNUNG
system - einen Shell-Befehl ausführen

ÜBERSICHT
#include <stdlib.h>

int system(const char *befehl);

BESCHREIBUNG
system() führt einen in befehl angegebenen Befehl durch Aufruf von /bin/sh -c befehl aus und kehrt zurück nachdem der Befehl abgeschlossen wurde. Während der Ausführung des Befehls wird SIGCHLD blockiert und sowohl SIGINT als auch SIGQUIT werden ignoriert.

RÜCKGABEWERT
Im Fehlerfall wird -1 (z.B. fork(2) fehlgeschlagen) und andernfalls der Status des Befehls zurückgegeben. Dieser letztgenannte Rückgabestatus hat das in wait(2) spezifizierte Format. In dem Fall, dass /bin/sh nicht ausgeführt werden konnte, wird der Exit-Status der des Befehls sein, der exit(127) aufrief.

Falls der Wert von befehl NULL ist, gibt system() eine Wert ungleich Null zurück, wenn die Shell verfügbar ist und Null, wenn nicht.

system() beeinflusst nicht den Wartestatus anderer Kindprozesse.

KONFORM ZU
C89, C99, POSIX.1-2001.

ANMERKUNGEN

Falls das Feature-Test-Makro _XOPEN_SOURCE definiert wurde (vor dem Einbinden irgendwelcher Header-Dateien), dann werden die in wait(2) beschriebenen Makros (WEXITSTATUS(), etc.) durch das Einbinden von <stdlib.h> zur Verfügung gestellt.

Wie erwähnt, ignoriert system() SIGINT und SIGQUIT. Dies kann dazu führen, dass Programme, die es in einer Schleife aufrufen, nicht mehr unterbrochen werden können, sofern sie nicht aufpassen, dass sie selbst den Exit-Status des Kindprozesses prüfen. Z.B.
    while (etwas) {
        int ret = system("foo");
        if (WIFSIGNALED(ret) &&
            (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT))
                break;
    }

Benutzen Sie system() nicht von einem Programm mit SUID- oder SGID-Rechten, da unbekannte Werte für einige Umgebungsvariablen benutzt werden könnten, die möglicherweise die Systemintegrität untergraben. Benutzen Sie stattdessen die Funktionen der exec(3)-Familie, jedoch nicht execlp(3) oder execvp(3). Genaugenommen wird system() aus Programmen mit SUID- oder SGID-Rechten nicht richtig auf Systemen funktionieren, auf denen /bin/sh Bash in der Version 2 vorliegt, da Bash 2 beim Start Privilegien verwirft. (Debian benutzt eine veränderte Bash, die dies unterlässt, wenn sie als sh aufgerufen wird.

In Glibc-Versionen vor 2.1.3 wurde die Verfügbarkeit von /bin/sh genaugenommen nicht überprüft, wenn befehl NULL war. Stattdessen wurde angenommen, es sei verfügbar und system() gab in diesem Fall immer 1 zurück. Seit Glibc 2.1.3 wird diese Überprüfung durchgeführt, da, obwohl POSIX.1-2001 eine entsprechende Implementierung benötigt, um eine Shell zur Verfügung zu stellen, diese Shell nicht verfügbar oder ausführbar sein könnte, wenn das aufrufende Programm vorher chroot(2) aufrief (was nicht durch POSIX.1-2001 spezifiziert ist).

Es ist möglich, dass der Shell-Befehl 127 zurückgibt. Dies ist kein eindeutiger Indikator dafür, dass der Aufruf von execve(2) fehlschlug.

SIEHE AUCH
sh(1), signal(2), wait(2), exec(3)

KOLOPHON
Diese Seite ist Teil der Veröffentlichung 3.27 des Projekts Linux-man-pages. Eine Beschreibung des Projekts und Informationen, wie Fehler gemeldet werden können, finden sich unter http://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Patrick Rother <krd@gulu.net> und Chris Leick <c.leick@vollbio.de> erstellt. Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen. Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an <debian-l10n-german@lists.debian.org>.