spawnl, spawnle, spawnlp, spawnlpe, spawnv, spawnve, spawnvp, spawnvpe, _wspawnl, _wspawnle, _wspawnlp, _wspawnlpe, _wspawnv, _wspawnve, _wspawnvp, _wspawnvpe

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu process.h - Index


Header-Datei

process.h

Kategorie

Prozesssteuerungsroutinen

Prototyp

int spawnl(int mode, char *path, char *arg0, arg1, ..., argn, NULL);

int _wspawnl(int mode, wchar_t *path, wchar_t *arg0, arg1, ..., argn, NULL);

int spawnle(int mode, char *path, char *arg0, arg1, ..., argn, NULL, char *envp[]);

int _wspawnle(int mode, wchar_t *path, wchar_t *arg0, arg1, ..., argn, NULL, wchar_t *envp[]);

int spawnlp(int mode, char *path, char *arg0, arg1, ..., argn, NULL);

int _wspawnlp(int mode, wchar_t *path, wchar_t *arg0, arg1, ..., argn, NULL);

int spawnlpe(int mode, char *path, char *arg0, arg1, ..., argn, NULL, char *envp[]);

int _wspawnlpe(int mode, wchar_t *path, wchar_t *arg0, arg1, ..., argn, NULL, wchar_t *envp[]);

int spawnv(int mode, char *path, char *argv[]);

int _wspawnv(int mode, wchar_t *path, wchar_t *argv[]);

int spawnve(int mode, char *path, char *argv[], char *envp[]);

int _wspawnve(int mode, wchar_t *path, wchar_t *argv[], wchar_t *envp[]);

int spawnvp(int mode, char *path, char *argv[]);

int _wspawnvp(int mode, wchar_t *path, wchar_t *argv[]);

int spawnvpe(int mode, char *path, char *argv[], char *envp[]);

int _wspawnvpe(int mode, wchar_t *path, wchar_t *argv[], wchar_t *envp[]);

Anmerkung:  Bei den Funktionen spawnle, spawnlpe, spawnv, spawnve, spawnvp und spawnvpe muss der letzte String NULL sein.

Beschreibung

Die Funktionen der spawn-Familie erstellen andere Dateien und führen sie aus. Die so gestarteten Prozesse werden als untergeordnete Prozesse (child processes) bezeichnet. Damit ein untergeordneter Prozess geladen und gestartet werden kann, muss ausreichend Speicher verfügbar sein.

Der Wert des Parameters mode legt fest, welche Aktion der aufrufende Prozess (der übergeordnete Prozess) nach dem Aufruf von spawn... ausführt. Der Parameter mode kann folgende Werte annehmen:

P_WAIT

Versetzt den übergeordneten Prozess in den Wartezustand, bis der untergeordnete Prozess ausgeführt ist.

P_NOWAIT

Der übergeordnete Prozess wird während der Ausführung des untergeordneten Prozesses weiter ausgeführt. Die ID des untergeordneten Prozesses wird zurückgegeben, so dass der übergeordnete Prozess mit cwait oder wait auf den Abschluss des untergeordneten Prozesses warten kann.

P_NOWAITO

Entspricht P_NOWAIT, mit dem Unterschied, dass das Betriebssystem die ID des untergeordneten Prozesses nicht speichert und der übergeordnete Prozess daher nicht mit cwait oder wait auf den Abschluss des untergeordneten Prozesses warten kann.

P_DETACH

Entspricht P_NOWAITO, mit dem Unterschied, dass der untergeordnete Prozess im Hintergrund ausgeführt wird, ohne auf Tastatur oder Bildschirm zugreifen zu können.

P_OVERLAY

Der untergeordnete Prozess wird in dem Speicherbereich abgelegt, den vorher der übergeordnete Prozess eingenommen hat. Dies entspricht dem Aufruf einer Funktion der exec-Familie.



Der Parameter path enthält den Dateinamen des aufgerufenen untergeordneten Prozesses. Die spawn-Funktionen suchen nach dieser Datei mittels der vom Betriebssystem bereitgestellten Suchalgorithmen:

  • Enthält der Name keine Erweiterung oder keinen Punkt, wird nach einer Datei mit genau übereinstimmendem Namen gesucht. Wurde die Datei nicht gefunden, wird zuerst nach einer Datei mit der Erweiterung EXE, dann mit COM und schließlich mit BAT gesucht.
  • Wurde eine Erweiterung angegeben, wird nur nach einer Datei mit genau übereinstimmendem Namen gesucht.
  • Wurde nur ein Punkt angegeben, wird nur nach einer Datei mit genau übereinstimmendem Namen ohne Erweiterung gesucht.
  • Enthält path keine Verzeichnisangabe, dann durchsuchen die spawn-Funktionen mit dem Suffix p zunächst das aktuelle Verzeichnis, dann die Verzeichnisse, die in der Umgebungsvariablen PATH des Betriebssystems angegeben sind.

Die dem "Familiennamen" der spawn-Funktionen angefügten Suffixe p, l, v und e geben an, dass die so benannte Funktion über bestimmte Fähigkeiten verfügt.

p Die Funktion sucht nach der Datei in den in der Umgebungsvariablen PATH angegebenen Verzeichnissen. Ohne das Suffix p durchsucht die Funktion nur das aktuelle Arbeitsverzeichnis. l Die Argumentzeiger arg0, arg1, ..., argn werden als separate Argumente übergeben. In der Regel wird das Suffix l dann verwendet, wenn die Anzahl der übergebenen Argumente schon vorher bekannt ist. v Die Argumentzeiger argv[0], ..., arg[n] werden als Zeigerarray übergeben. In der Regel wird das Suffix v dann verwendet, wenn eine variable Anzahl von Argumenten zu übergeben ist. e Das Argument envp kann an den untergeordneten Prozess übergeben werden; dadurch können Sie die Umgebung des untergeordneten Prozesses ändern. Ohne das Suffix e erbt der untergeordnete Prozess die Umgebung des übergeordneten Prozesses.



Bei jeder Funktion der spawn-Familie muss einer der beiden argumentspezifierenden Suffixe angegeben werden (entweder l oder v). Die Suffixe für Pfadsuche und Umgebungsvererbung (p und e) sind optional.

Beispiele:

  • spawnl übernimmt separate Argumente, durchsucht nur das aktuelle Verzeichnis nach dem untergeordneten Prozess und übergibt ihm die Umgebung des übergeordneten Prozesses.
  • spawnvpe übernimmt ein Array von Argumentzeigern, schließt in die Suche nach dem untergeordneten Prozess auch die PATH-Angaben ein und akzeptiert das Argument envp zur Änderung der Umgebung des untergeordneten Prozesses.

Die spawn-Funktionen müssen wenigstens ein Argument an den untergeordneten Prozess übergeben (arg0 oder argv[0]). Gemäß Konvention ist dieses Argument eine Kopie des Zugriffspfads. (Wird ein anderer Wert für dieses 0te Argument angegeben, führt dies nicht zu einem Fehler.) Wenn Sie dem untergeordneten Prozess eine leere Argumentliste übergeben wollen, müssen arg0 oder argv[0] den Wert NULL haben.

Wenn das Suffix l verwendet wird, dann zeigt arg0 in der Regel auf den Zugriffspfad und arg1, ...., argn zeigen auf die Zeichenstrings, die die neue Liste von Argumenten bilden. Das zwingend erforderliche Nullzeichen markiert das Ende der Liste.

Wenn Sie das Suffix e verwenden, dann übergeben Sie über das Argument envp eine Liste neuer Umgebungseinstellungen. Dieses Umgebungsargument ist ein Array von Zeichenzeigern. Jedes Element zeigt auf einen nullterminierten String der Form

envvar = value

wobei envvar der Name einer Umgebungsvariablen und value der Stringwert ist, auf den envvar gesetzt wird. Das letzte Element von envp[] ist Null. Hat envp den Wert Null, erbt der untergeordnete Prozess die Umgebungseinstellungen des übergeordneten Prozesses.

Die Gesamtlänge von arg0 + arg1 + ... + argn (oder von argv[0] + argv[1] + ... + argv[n]), einschließlich der die Argumente voneinander trennenden Leerzeichen muss kleiner als 260 Bytes für Windows (128 für DOS) sein. Die terminierenden Nullzeichen werden nicht gezählt.

Wird eine spawn-Funktion aufgerufen, bleiben offene Dateien auch im untergeordneten Prozess geöffnet.

Rückgabewert

Wenn erfolgreich, geben die spawn-Funktionen, die mit dem Argument mode gleich P_WAIT aufgerufen wurden, den Exit-Status des untergeordneten Prozesses zurück (0 für die normale Beendigung). Ruft der untergeordnete Prozess explizit exit mit einem Argument ungleich Null auf, kann sein Exit-Status auf einen Wert ungleich Null gesetzt werden.

Hatte mode den Wert P_NOWAIT oder P_NOWAITO geben die spawn-Funktionen die Prozess-ID des untergeordnete Prozesses zurück. Die bei Verwendung von P_NOWAIT erhaltene ID kann an cwait übergeben werden.

Bei einem Fehler geben die spawn-Funktionen -1 zurück, und die globale Variable errno wird auf einen der folgenden Werte gesetzt:

E2BIG

Arg list too long (Argumentliste zu lang)

EINVAL

Invalid argument (Ungültiges Argument)

ENOENT

Path or file name not found (Pfad oder Dateiname nicht gefunden)

ENOEXEC

Exec format error (Fehler beim Exec-Format)

ENOMEM

Not enough memory (Speicher nicht ausreichend)



Beispiel



 #include <process.h>
 #include <stdio.h>
 void spawnl_example(void)
 {
    int result;
    result = spawnl(P_WAIT, "bcc32.exe", "bcc32.exe", NULL);
    if (result == -1)
    {
       perror("Error from spawnl");
       exit(1);
    }
 }
 int main(void)
 {
   spawnl_example();
   return 0;
 }