Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

system - Systemkommando ausführen

&pagelevel(4)&pagelevel

Definition

#include <stdlib.h>

int system(const char *command);

Beschreibung

Beschreibung

system() führt das Systemkommando aus, das in der Zeichenkette command steht. command wird an einen Kommando-Interpreter übergeben. Je nach Wahl der Funktionalität wird command als POSIX- oder BS2000-Kommando interpretiert (siehe Abschnitt "Wahl der Funktionalität").

Wenn command ein POSIX-Kommando ist, verhält sich dessen Umgebung, als ob durch einen fork-Aufruf ein Sohnprozess erzeugt worden wäre und der Sohnprozess das sh-Kommando mit execl() wie folgt aufgerufen hätte:

execl( shell_path , "sh", "-c", command , (char *)0);

Für shell_path muss der Pfadname des sh-Kommandos eingesetzt werden.

system() kehrt erst zurück, wenn sich der Sohnprozess beendet hat und beeinflusst dessen Endestatus nicht.

BS2000
Wenn command ein BS2000-Kommando ist, wird das BS2000-Kommando in derselben Task ausgeführt, in der das system() aufrufende Programm läuft. Das aufrufende Programm wird entladen, wenn im system-Aufruf Programme oder Prozeduren gestartet werden (siehe auch „Hinweis“). (Ende)

Returnwert

Endestatus des Kommando-Interpreters



wenn command kein Nullzeiger ist und das Kommando erfolgreich ausgeführt wurde. Der Endestatus des Kommando-Interpreters wird in dem Format geliefert, das durch waitpid() spezifiziert ist. Der Endestatus des Kommando-Interpreters entspricht dem des sh-Kommandos, außer wenn ein Fehler den Kommando-Interpreter an der Ausführung hindert, nachdem der Sohnprozess erzeugt wurde. Der Endestatus von system() ist dann, als ob der Kommando-Interpreter durch exit(127) oder _exit(127) beendet worden wäre.


!= 0

wenn command ein Nullzeiger ist und ein Kommando-Interpreter vorhanden ist.


-1

wenn kein Sohnprozess erzeugt werden kann oder wenn der Kommando-Interpreter keinen Endestatus hat.
errno wird gesetzt, um den Fehler anzuzeigen.


BS2000


0

wenn command erfolgreich ausgeführt wurde (Returnwert des BS2000-Kommandos: 0)


-1

wenn das BS2000-Kommando nicht erfolgreich ausgeführt wurde (Returnwert des Kommandos: Fehlernummer != 0)


undefiniert

wenn nach dem BS2000-Kommando nicht in das Programm zurückverzweigt wird (siehe auch "Hinweise“). (Ende)

Fehler

system() schlägt fehl, wenn gilt:


EAGAIN

Das System hat die notwendigen Ressourcen, um einen weiteren Prozess zu erzeugen, nicht zur Verfügung oder die systemspezifische Grenze für die Maximalzahl gleichzeitig ausgeführter Prozesse für das System oder eine einzelne Benutzernummer {CHILD_MAX} würde überschritten werden.


Erweiterung


EINTR

system() wurde durch ein Signal unterbrochen. (Ende)


ENOMEM

Es ist nicht genügend Speicherplatz verfügbar.

Hinweise

Wenn der Returnwert von system() nicht -1 ist, kann dessen Wert durch die Makros entschlüsselt werden, die sowohl in sys/wait.h als auch in stdlib.h definiert sind.

Mit der folgenden Funktion kann ermittelt werden, ob eine XPG4-konforme Umgebung vorhanden ist: sysconf(_SC_2_VERSION).

Solange system() auf die Beendigung des Sohnprozesses wartet, muss sie die Signale SIGINT und SIGQUIT ignorieren und SIGCHLD blockieren. Signale werden dann im ausgeführten Kommando so behandelt, wie es für fork() und exec beschrieben ist. Wenn zum Beispiel SIGINT abgefangen oder auf SIG_DFL gesetzt wird, wenn system() aufgerufen wird, dann wird der Sohnprozess mit der Einstellung SIG_DFL für SIGINT gestartet.

Wenn SIGINT und SIGQUIT im Vaterprozess ignoriert werden, treten keine Koordinationsprobleme auf (zum Beispiel wenn zwei Prozesse 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 beim Kommando "!" bei vielen interaktiven Anwendungen der Fall ist). In beiden Fällen sollte das Signal nur an den Sohnprozess 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 system() dazu verwendet, einen für den Benutzer transparenten Prozess auszuführen. Wenn der Benutzer ein Unterbrechungszeichen eingibt (zum Beispiel ^C), während system() so verwendet wird, könnte man erwarten, dass die Anwendung abgebrochen wird. Es wird jedoch nur das ausgeführte Kommando abgebrochen. Anwendungen, die

system() so verwenden, müssen den Endestatus von system() sorgfältig prüfen und feststellen, ob das ausgeführte Kommando erfolgreich beendet wurde. Wenn das Kommando fehlschlägt, müssen entsprechende Schritte in die Wege geleitet werden.

Wenn SIGCHLD blockiert wird, während auf die Beendigung des Sohnprozesses gewartet wird, verhindert dies, dass 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 ausgeführt wird, kann sich vom Kontext unterscheiden, in dem system() aufgerufen wurde. Wenn z.B. Dateideskriptoren, bei denen das Flag FD_CLOEXEC gesetzt ist, geschlossen werden, unterscheiden sich Prozessnummer und Vaterprozessnummer von system() und dem Kommando. Wenn das ausgeführte Kommando seine Umgebungsvariablen oder das aktuelle Dateiverzeichnis ändert, wird auch diese Veränderung nicht im Kontext des Aufrufs berücksichtigt.

Nach einem chroot-Aufruf kann sh nicht vorhanden sein.

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 sh-Kommandos sicher findet.

BS2000
Das BS2000-Kommando kann maximal 2048 Zeichen lang sein und muss nicht mit dem System-Schrägstrich (/) angegeben werden.

Nach einigen Kommandos (START-PROG, LOAD-PROG, CALL-PROCEDURE, DO, HELP-SDF) wird nicht in das aufrufende Programm zurückverzweigt. Lässt ein Programm solche vorzeitigen Programmbeendigungen zu, sollte es vor dem system-Aufruf die Puffer leeren (fflush()) bzw. die Dateien schließen.

system() übergibt die Zeichenkette cmd unverändert dem BS2000-Kommandoprozessor MCLP als Eingabe (siehe auch Handbuch „Makroaufrufe an den Ablaufteil“ [10]). Es erfolgt keine Umsetzung in Großbuchstaben. (Ende)

Siehe auch

bs2system(), exec, fork(), pipe(), sysconf(), wait(), limits.h, signal.h, stdio.h, Kommando sh im Handbuch „POSIX-Kommandos“ [2].