Provided by: manpages-de-dev_1.11-1_all bug

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

       Siehe attributes(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke.

       ┌──────────────┬───────────────────────┬─────────┐
       │SchnittstelleAttributWert    │
       ├──────────────┼───────────────────────┼─────────┤
       │system()      │ Multithread-Fähigkeit │ MT-Safe │
       └──────────────┴───────────────────────┴─────────┘

KONFORM ZU

       POSIX.1-2001, POSIX.1-2008, C89, C99.

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

       Diese  Seite  ist  Teil  der  Veröffentlichung  4.04  des  Projekts  Linux-man-pages. Eine
       Beschreibung des Projekts, Informationen, wie Fehler  gemeldet  werden  können  sowie  die
       aktuelle Version dieser Seite 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>.

                                          8. August 2015                                SYSTEM(3)