SYSTEM(3)

BEZEICHNUNG
system - einen Shell-Befehl ausführen

ÜBERSICHT
#include <stdlib.h>

int system(const char *Befehl);

BESCHREIBUNG
Die Bibliotheksfunktion system() verwendet fork(2), um einen Kindprozess zu erzeugen, der den in Befehl angegebenen Shell-Befehl mittels execl(3) wie folgt ausführt:
    execl("/bin/sh", "sh", "-c", Befehl, (char *) 0); system() kehrt nach der Ausführung zurück. Während der Ausführung des Befehls wird SIGCHLD blockiert und SIGINT sowie SIGQUIT werden in den system()-Prozessaufrufen ignoriert (diese Signale werden gemäß ihrer Voreinstellungen innerhalb des Kindprozesses behandelt, der Befehl ausführt). Falls Befehl NULL ist, gibt system() einen Status zurück, der angibt, ob auf dem System eine Shell verfügbar ist.

RÜCKGABEWERT
Der Rückgabewert von system() ist einer der folgenden:

*   Falls Befehl NULL ist, ein Wert ungleich Null, wenn die Shell verfügbar ist oder Null, wenn nicht.

*   Falls ein Kindprozess nicht erstellt werden konnte oder sein Status nicht erneut geholt werden kann, ist der Rückgabewert -1.

*   Falls in dem Kindprozess keine Shell ausgeführt werden kann, ist der Rückgabewert so, als ob die Shell im Kindprozess durch den Aufruf von _exit(2) mit dem Status 127 beendet worden wäre.

*   Falls alle Systemaufrufe erfolgreich waren, dann wird der Rückgabewert der Status beim Beenden der Kind-Shell sein, die zum Ausführen von Befehl benutzt wurde. (Der Status beim Beenden einer Shell ist der Status beim Beenden des letzten von ihr ausgeführten Befehls.)

In den letzten beiden Fällen ist der Rückgabewert ein »Wartestatus«, der mittels der in waitpid(2) beschriebenen Macros untersucht werden kann (d.h. WIFEXITED(), WEXITSTATUS() und so weiter).

system() beeinflusst nicht den Wartestatus anderer Kindprozesse.

ATTRIBUTE

  Multithreading (siehe pthreads(7))
Die Funktion system() ist multithread-fähig.

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

ANMERKUNGEN
system() stellt Einfachheit und Komfort bereit. Es behandelt alle Einzelheiten beim Aufrufen von fork(2), execl(3) und waitpid(2) sowie die nötigen Manipulationen von Signalen. Zusätzlich führt die Shell die üblichen Ersetzungen von E/A-Umleitungen für Befehl durch. Am stärksten geht dies zu Lasten der Leistungsfähigkeit: Zum Erzeugen des Prozesses, der die Shell startet, sowie zum Ausführen der Shell werden zusätzliche Systemaufrufe benötigt. Falls das Feature-Test-Makro _XOPEN_SOURCE definiert wurde (vor dem Einbinden irgendwelcher Header-Dateien), dann werden die in waitpid(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. Zum Beispiel:
    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 ein Shell-Befehl mit dem Status 127 beendet wird. Dies ergibt einen Rückgabewert von system(), der nicht von dem Fall zu unterscheiden ist, in dem eine Shell nicht im Kindprozess ausgeführt werden kann.

SIEHE AUCH
sh(1), sigaction(2), sigprocmask(2), fork(2), wait(2), exec(3), signal(7)

KOLOPHON
This page is part of release 3.80 of the Linux man-pages project. A description of the project, information about reporting bugs, and the latest version of this page, can be found at 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>.