system(3) Library Functions Manual system(3) BEZEICHNUNG system - einen Shell-Befehl ausfuhren BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include int system(const char *Befehl); BESCHREIBUNG Die Bibliotheksfunktion system() verhalt sich, als ob sie fork(2) verwenden wurde, um einen Kindprozess zu erzeugen, der den in Befehl angegebenen Shell-Befehl mittels execl(3) wie folgt ausfuhrte: execl("/bin/sh", "sh", "-c", Befehl, (char *) NULL); system() kehrt nach der Ausfuhrung zuruck. Wahrend der Ausfuhrung des Befehls wird SIGCHLD blockiert und SIGINT sowie SIGQUIT werden in den system()-Prozessaufrufen ignoriert (diese Signale werden gemass ihrer Voreinstellungen innerhalb des Kindprozesses behandelt, der Befehl ausfuhrt). Falls Befehl NULL ist, gibt system() einen Status zuruck, der angibt, ob auf dem System eine Shell verfugbar ist. RUCKGABEWERT Der Ruckgabewert von system() ist einer der folgenden: o Falls Befehl NULL ist, ein Wert ungleich Null, wenn die Shell verfugbar ist oder Null, wenn nicht. o Falls ein Kindprozess nicht erstellt werden konnte oder sein Status nicht erneut geholt werden kann, ist der Ruckgabewert -1 und errno wird gesetzt, um den Fehler anzuzeigen. o Falls in dem Kindprozess keine Shell ausgefuhrt werden kann, ist der Ruckgabewert so, als ob die Shell im Kindprozess durch den Aufruf von _exit(2) mit dem Status 127 beendet worden ware. o Falls alle Systemaufrufe erfolgreich waren, dann wird der Ruckgabewert der Status beim Beenden der Kind-Shell sein, die zum Ausfuhren von Befehl benutzt wurde. (Der Status beim Beenden einer Shell ist der Status beim Beenden des letzten von ihr ausgefuhrten Befehls.) In den letzten beiden Fallen ist der Ruckgabewert ein >>Wartestatus<<, der mittels der in waitpid(2) beschriebenen Makros untersucht werden kann (d.h. WIFEXITED(), WEXITSTATUS() und so weiter). system() beeinflusst nicht den Wartestatus anderer Kindprozesse. FEHLER system() kann mit den gleichen Fehlern wie fork(2) fehlschlagen. ATTRIBUTE Siehe attributes(7) fur eine Erlauterung der in diesem Abschnitt verwandten Ausdrucke. +--------------------------------+-------------------------+-----------+ |Schnittstelle | Attribut | Wert | +--------------------------------+-------------------------+-----------+ |system() | Multithread-Fahigkeit | MT-Sicher | +--------------------------------+-------------------------+-----------+ STANDARDS C11, POSIX.1-2008. GESCHICHTE POSIX.1-2001, C89. ANMERKUNGEN system() stellt Einfachheit und Komfort bereit. Es behandelt alle Einzelheiten beim Aufrufen von fork(2), execl(3) und waitpid(2) sowie die notigen Manipulationen von Signalen. Zusatzlich fuhrt die Shell die ublichen Ersetzungen von E/A-Umleitungen fur Befehl durch. Am starksten geht dies zu Lasten der Leistungsfahigkeit: Zum Erzeugen des Prozesses, der die Shell startet, sowie zum Ausfuhren der Shell werden zusatzliche Systemaufrufe benotigt. 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 zur Verfugung gestellt. Wie erwahnt, ignoriert system() SIGINT und SIGQUIT. Dies kann dazu fuhren, dass Programme, die es in einer Schleife aufrufen, nicht mehr unterbrochen werden konnen, sofern sie nicht aufpassen, dass sie selbst den Exit-Status des Kindprozesses prufen. Zum Beispiel: while (etwas) { int ret = system("foo"); if (WIFSIGNALED(ret) && (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT)) break; } Laut POSIX.1 ist nicht spezifiziert, ob mittels pthread_atfork(3) registrierte Handler wahrend der Ausfuhrung von system() aufgerufen werden. In der Glibc-Implementierung werden solche Handler nicht aufgerufen. Vor Glibc 2.1.3 wurde die Verfugbarkeit von /bin/sh genaugenommen nicht uberpruft, wenn Befehl NULL war. Stattdessen wurde angenommen, es sei verfugbar und system() gab in diesem Fall immer 1 zuruck. Seit Glibc 2.1.3 wird diese Uberprufung durchgefuhrt, da, obwohl POSIX.1-2001 eine entsprechende Implementierung benotigt, um eine Shell zur Verfugung zu stellen, diese Shell nicht verfugbar oder ausfuhrbar sein konnte, wenn das aufrufende Programm vorher chroot(2) aufrief (was nicht durch POSIX.1-2001 spezifiziert ist). Es ist moglich, dass ein Shell-Befehl mit dem Status 127 beendet wird. Dies ergibt einen Ruckgabewert von system(), der nicht von dem Fall zu unterscheiden ist, in dem eine Shell nicht im Kindprozess ausgefuhrt werden kann. Warnungen Benutzen Sie system() nicht aus einem privilegierten Programm (einem Set-User-ID- oder Set-Group-ID-Programm oder einem mit Capabilities), da merkwurdige Werte fur einige Umgebungsvariablen benutzt werden konnten, die moglicherweise die Systemintegritat untergraben. Beispielsweise konnte PATH so verandert sein, dass ein beliebiges Programm mit Privilegien ausgefuhrt wird. Benutzen Sie stattdessen die Funktionen der exec(3)-Familie, jedoch nicht execlp(3) oder execvp(3) (die auch die Umgebungsvariable PATH zur Suche nach Programmen verwenden). 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 als Sicherheitsmassnahme beim Start Privilegien verwirft. (Debian benutzt eine andere Shell, dash(1), die dies unterlasst, wenn sie als sh aufgerufen wird. Samtliche Benutzereingaben, die als Teil von command eingesetzt werden, sollten sorgfaltig bereinigt werden, um sicherzustellen, dass unerwartete Shell-Befehle oder Befehlsoptionen nicht ausgefuhrt werden. Solche Risiken sind besonders schwerwiegend, wenn system() aus einem privilegierten Programm verwandt wird. FEHLER Falls der Befehlsname mit einem Minuszeichen beginnt, interpretiert sh(1) den Befehlsnamen als Option, was in einem nicht definierten Verhalten resultiert (siehe die Option -c zu sh(1)). Um dieses Problem zu umgehen, stellen Sie dem Befehl ein Leerzeichen voran, wie im folgenden aufruf: system(" -ungunstiger-Befehlsname"); SIEHE AUCH sh(1), execve(2), fork(2), sigaction(2), sigprocmask(2), wait(2), exec(3), signal(7) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Patrick Rother , Chris Leick , Dr. Tobias Quathamer , Helge Kreutzmann und Mario Blattermann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.18 8. Februar 2026 system(3)