.\" -*- coding: UTF-8 -*- .\" Copyright (c) 1993 by Thomas Koenig (ig25@rz.uni-karlsruhe.de) .\" and Copyright (c) 2014 by Michael Kerrisk .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" Modified Sat Jul 24 17:51:15 1993 by Rik Faith (faith@cs.unc.edu) .\" Modified 11 May 1998 by Joseph S. Myers (jsm28@cam.ac.uk) .\" Modified 14 May 2001, 23 Sep 2001 by aeb .\" 2004-12-20, mtk .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH SYSTEM 3 "6. März 2019" "" Linux\-Programmierhandbuch .SH BEZEICHNUNG system \- einen Shell\-Befehl ausführen .SH ÜBERSICHT .nf \fB#include \fP .PP \fBint system(const char *\fP\fIBefehl\fP\fB);\fP .fi .SH BESCHREIBUNG Die Bibliotheksfunktion \fBsystem\fP() verwendet \fBfork\fP(2), um einen Kindprozess zu erzeugen, der den in \fIBefehl\fP angegebenen Shell\-Befehl mittels \fBexecl\fP(3) wie folgt ausführt: .PP .in +4n .EX execl("/bin/sh", "sh", "\-c", Befehl, (char *) NULL); .EE .in .PP \fBsystem\fP() kehrt nach der Ausführung zurück. .PP Während der Ausführung des Befehls wird \fBSIGCHLD\fP blockiert und \fBSIGINT\fP sowie \fBSIGQUIT\fP werden in den \fBsystem\fP()\-Prozessaufrufen ignoriert (diese Signale werden gemäß ihrer Voreinstellungen innerhalb des Kindprozesses behandelt, der \fIBefehl\fP ausführt). .PP Falls \fIBefehl\fP NULL ist, gibt \fBsystem\fP() einen Status zurück, der angibt, ob auf dem System eine Shell verfügbar ist. .SH RÜCKGABEWERT Der Rückgabewert von \fBsystem\fP() ist einer der folgenden: .IP * 3 Falls \fIBefehl\fP NULL ist, ein Wert ungleich Null, wenn die Shell verfügbar ist oder Null, wenn nicht. .IP * Falls ein Kindprozess nicht erstellt werden konnte oder sein Status nicht erneut geholt werden kann, ist der Rückgabewert \-1 und \fIerrno\fP wird gesetzt, um den Fehler anzuzeigen. .IP * 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 \fB_exit\fP(2) mit dem Status 127 beendet worden wäre. .IP * Falls alle Systemaufrufe erfolgreich waren, dann wird der Rückgabewert der Status beim Beenden der Kind\-Shell sein, die zum Ausführen von \fIBefehl\fP benutzt wurde. (Der Status beim Beenden einer Shell ist der Status beim Beenden des letzten von ihr ausgeführten Befehls.) .PP In den letzten beiden Fällen ist der Rückgabewert ein »Wartestatus«, der mittels der in \fBwaitpid\fP(2) beschriebenen Makros untersucht werden kann (d.h. \fBWIFEXITED\fP(), \fBWEXITSTATUS\fP() und so weiter). .PP \fBsystem\fP() beeinflusst nicht den Wartestatus anderer Kindprozesse. .SH FEHLER \fBsystem\fP() kann mit den gleichen Fehlern wie \fBfork\fP(2) fehlschlagen. .SH ATTRIBUTE Siehe \fBattributes\fP(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke. .TS allbox; lb lb lb l l l. Schnittstelle Attribut Wert T{ \fBsystem\fP() T} Multithread\-Fähigkeit MT\-Safe .TE .SH "KONFORM ZU" POSIX.1\-2001, POSIX.1\-2008, C89, C99. .SH ANMERKUNGEN \fBsystem\fP() stellt Einfachheit und Komfort bereit. Es behandelt alle Einzelheiten beim Aufrufen von \fBfork\fP(2), \fBexecl\fP(3) und \fBwaitpid\fP(2) sowie die nötigen Manipulationen von Signalen. Zusätzlich führt die Shell die üblichen Ersetzungen von E/A\-Umleitungen für \fIBefehl\fP 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. .PP Falls das Feature\-Test\-Makro \fB_XOPEN_SOURCE\fP definiert wurde (vor dem Einbinden \fIirgendwelcher\fP Header\-Dateien), dann werden die in \fBwaitpid\fP(2) beschriebenen Makros (\fBWEXITSTATUS\fP(), etc.) durch das Einbinden von \fI\fP zur Verfügung gestellt. .PP Wie erwähnt, ignoriert \fBsystem\fP() \fBSIGINT\fP und \fBSIGQUIT\fP. 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: .PP .in +4n .EX while (etwas) { int ret = system("foo"); if (WIFSIGNALED(ret) && (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT)) break; } .EE .in .PP Laut POSIX.1 ist nicht spezifiziert, ob mittels \fBpthread_atfork\fP(3) registrierte Handler während der Ausführung von \fBsystem\fP() aufgerufen werden. In der Glibc\-Implementierung werden solche Handler nicht aufgerufen. .PP In Glibc\-Versionen vor 2.1.3 wurde die Verfügbarkeit von \fI/bin/sh\fP genaugenommen nicht überprüft, wenn \fIBefehl\fP NULL war. Stattdessen wurde angenommen, es sei verfügbar und \fBsystem\fP() 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 \fBchroot\fP(2) aufrief (was nicht durch POSIX.1\-2001 spezifiziert ist). .PP .\" Es ist möglich, dass ein Shell\-Befehl mit dem Status 127 beendet wird. Dies ergibt einen Rückgabewert von \fBsystem\fP(), der nicht von dem Fall zu unterscheiden ist, in dem eine Shell nicht im Kindprozess ausgeführt werden kann. .SS Warnungen Benutzen Sie \fBsystem\fP() nicht aus einem privilegierten Programm (einem Set\-User\-ID\- oder Set\-Group\-ID\-Programm oder einem mit Capabilities), da merkwürdige Werte für einige Umgebungsvariablen benutzt werden könnten, die möglicherweise die Systemintegrität untergraben. Beispielsweise könnte \fBPATH\fP so verändert sein, dass ein beliebiges Programm mit Privilegien ausgeführt wird. Benutzen Sie stattdessen die Funktionen der \fBexec\fP(3)\-Familie, jedoch nicht \fBexeclp\fP(3) oder \fBexecvp\fP(3) (die auch die Umgebungsvariable \fBPATH\fP zur Suche nach Programmen verwenden). .PP Genaugenommen wird \fBsystem\fP() aus Programmen mit SUID\- oder SGID\-Rechten nicht richtig auf Systemen funktionieren, auf denen \fI/bin/sh\fP Bash in der Version 2 vorliegt, da Bash 2 als Sicherheitsmaßnahme beim Start Privilegien verwirft. (Debian benutzt eine andere Shell, \fBdash\fP(1), die dies unterlässt, wenn sie als \fBsh\fP aufgerufen wird. .PP Sämtliche Benutzereingaben, die als Teil von \fIcommand\fP eingesetzt werden, sollten \fIsorgfältig\fP bereinigt werden, um sicherzustellen, dass unerwartete Shell\-Befehle oder Befehlsoptionen nicht ausgeführt werden. Solche Risiken sind besonders schwerwiegend, wenn \fBsystem\fP() aus einem privilegierten Programm verwandt wird. .SH "SIEHE AUCH" \fBsh\fP(1), \fBexecve\fP(2), \fBfork\fP(2), \fBsigaction\fP(2), \fBsigprocmask\fP(2), \fBwait\fP(2), \fBexec\fP(3), \fBsignal\fP(7) .SH KOLOPHON Diese Seite ist Teil der Veröffentlichung 5.10 des Projekts Linux\-\fIman\-pages\fP. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter \%https://www.kernel.org/doc/man\-pages/. .SH ÜBERSETZUNG Die deutsche Übersetzung dieser Handbuchseite wurde von Patrick Rother , Chris Leick , Dr. Tobias Quathamer , Helge Kreutzmann und Mario Blättermann erstellt. Diese Übersetzung ist Freie Dokumentation; lesen Sie die .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 .UE 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 die .MT debian-l10n-german@\:lists.\:debian.\:org Mailingliste der Übersetzer .ME .