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.
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.42 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>.