Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ system(3S) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

sh(1)

exec(2)

wait(2)

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

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026