system(3S) system(3S)
NAME
system - Shell-Kommando absetzen
SYNTAX
#include <stdlib.h>
int system(const char *command);
BESCHREIBUNG
system() bewirkt, daß die Zeichenkette command als Eingabe an die
Shell [siehe sh(1)] übergeben wird, so als ob die Zeichenkette als
Kommando an einem Terminal eingegeben worden wäre. Der aktuelle Prozeß
wartet, bis das Shell-Kommando ausgeführt worden ist und gibt dann den
Endestatus der Shell in dem durch waitpid() angegebenen Format zurück.
Wenn command ein Nullzeiger ist, überprüft system(), ob /sbin/sh vor-
handen und ausführbar ist. Wenn /sbin/sh verfügbar ist, gibt system()
einen Wert ungleich null zurück; sonst gibt es null zurück.
system() scheitert, wenn:
EINTR system() wurde durch ein Signal unterbrochen [XPG3].
EAGAIN Im System ist nicht genügend Platz vorhanden, um einen wei-
teren Prozeß zu starten, oder die maximale Anzahl ausführba-
rer Prozesse ist systemweit oder durch einen Benutzer
(CHILDMAX) erreicht.
ERGEBNIS
system() erzeugt einen neuen Sohnprozeß, der seinerseits /sbin/sh
durch exec aktiviert, um command auszuführen. Scheitert fork() oder
exec(), so gibt system() einen negativen Wert zurück und setzt errno.
HINWEISE
Wenn der Rückgabewert von system() nicht -1 ist, kann dessen Wert
durch Verwendung der in sys/wait.h beschriebenen Makros entschlüsselt
werden. Diese Makros stehen auch in stdlib.h zur Verfügung.
Während die Funktion system() auf die Beendigung des Sohnprozesses
wartet, muß sie die Signale SIGINT und SIGQUIT ignorieren und SIGCHLD
blockieren. Die Behandlung der Signale im ausgeführten Kommando ist
jedoch so, wie es durch fork() und exec() angegeben ist. Wenn zum Bei-
spiel SIGINT abgefangen oder auf SIGDFL gesetzt wird, wenn system()
aufgerufen wird, dann wird der Sohnprozeß mit der Einstellung SIGDFL
für SIGINT gestartet.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
system(3S) system(3S)
Wenn im XPG3-Modus SIGINT und SIGQUIT im Vaterprozeß ignoriert werden,
treten keine Koordinationsprobleme auf (zum Beispiel wenn zwei Pro-
zesse vom selben Terminal lesen), wenn das ausgeführte Kommando eines
der Signale ignoriert oder abfängt. Dies ist normalerweise auch dann
richtig, wenn der Benutzer ein Kommando an die Anwendung abgesetzt
hat, das synchron ausgeführt werden soll (wie es bei dem Kommando "!"
bei vielen interaktiven Anwendungen der Fall ist). In beiden Fällen
sollte das Signal nur an den Sohnprozeß, und nicht an die Anwendung,
geliefert werden. In einer Situation kann das Ignorieren der Signale
nicht den gewünschten Effekt haben. Dies ist dann der Fall, wenn die
Anwendung die Funktion system() dazu verwendet, einen für den Benutzer
transparenten Prozeß auszuführen. Wenn der Benutzer ein Unterbre-
chungszeichen eingibt (zum Beispiel ^C), während die Funktion system()
so verwendet wird, könnte man erwarten, daß die Anwendung abgebrochen
wird. Es wird jedoch nur das ausgeführte Kommando abgebrochen. Anwen-
dungen, die die Funktion system() so verwenden, müssen den Rückgabe-
Status der Funktion system() sorgfältig prüfen, und so feststellen, ob
das ausgeführte Kommando erfolgreich beendet wurde. Wenn das Kommando
fehlschlägt, müssen entsprechende Schritte in die Wege geleitet wer-
den.
Wenn SIGCHLD blockiert wird, während auf die Beendigung des Sohnpro-
zesses gewartet wird, so verhindert dies, daß die Anwendung das Signal
abfängt und den Status des Sohnprozesses von system() abfragt, bevor
system() selbst den Status abfragen kann.
Der Kontext, in dem das Kommando letztlich ausgeführt wird, kann sich
von dem Kontext unterscheiden, in dem die Funktion system() aufgerufen
wurde. So werden zum Beispiel Dateideskriptoren, bei denen das Flag
FDCLOEXEC gesetzt ist, geschlossen. Die Prozeßnummer und die Vater-
prozeßnummer sind dann anders. Wenn das ausgeführte Kommando seine
Umgebungsvariablen oder das aktuelle Dateiverzeichnis ändert, so wird
auch diese Veränderung nicht im Kontext des Aufrufs berücksichtigt.
Es gibt keine festgelegte Möglichkeit, wie eine Anwendung einen
bestimmten Pfad für die Shell herausfinden kann. confstr() kann jedoch
einen Wert für PATH zur Verfügung stellen, der das Kommando sh sicher
findet.
Die Shell unterliegt Restriktionen bezüglich der Verwendung des
s-Bits: Wenn sich reale (uid/gid) und effektive (euid/egid) Benutzer-
/Gruppennummern unterscheiden und (euid/egid) < 100 sind und egid
nicht "1" ist, werden (euid/egid) auf die Nummern von (uid/gid)
gesetzt.
SIEHE AUCH
sh(1), exec(2), wait(2).
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98