_spawn, _wspawn Funktionen

Jede der _spawn-Funktionen erstellt und führt einen neuen Prozess aus:

_spawnl, _wspawnl

_spawnv, _wspawnv

_spawnle, _wspawnle

_spawnve, _wspawnve

_spawnlp, _wspawnlp

_spawnvp, _wspawnvp

_spawnlpe, _wspawnlpe

_spawnvpe, _wspawnvpe

Die Buchstaben am Ende des Funktionsnamens bestimmen die Variante.

  • e
    envpArray, Zeiger auf die Umgebungseinstellungen, wird dem neuen Prozess übergeben.

  • l
    Befehlszeilenargumente werden einzeln zu _spawn-Funktion übergeben.Das Suffix wird normalerweise verwendet, wenn mehrere Parameter in einem neuen Prozess im Voraus bekannt.

  • p
    PATH Umgebungsvariable wird verwendet, um die Datei zu suchen.

  • v
    argv, Array von Zeigern auf den Befehlszeilenargumenten, wird auf _spawn-Funktion übergeben.Das Suffix wird normalerweise verwendet, wenn mehrere Parameter in einem neuen Prozess variabel ist.

Hinweise

_spawn kann jedes erstellen und ausführen einen neuen Prozess.Behandeln Sie Mehrbyte-Zeichenfolgen-Argumente automatisch erkannt und bei Bedarf derzeit verwendeten Mehrbytezeichen sequenzen entsprechend der Mehrbyte-Codepage.Die _wspawn-Funktionen sind Breitzeichenversionen der _spawn-Funktionen. Behandeln von Mehrbyte-Zeichenfolgen nicht.Andernfalls verhalten sich die _wspawn-Funktionen identisch mit ihren Äquivalenten _spawn .

Zuweisung generischer Textroutinen

Tchar.h-Routine

_UNICODE als auch _MBCS nicht definiert

_MBCS definieren

_UNICODE definiert

_tspawnl

_spawnl

_spawnl

_wspawnl

_tspawnle

_spawnle

_spawnle

_wspawnle

_tspawnlp

_spawnlp

_spawnlp

_wspawnlp

_tspawnlpe

_spawnlpe

_spawnlpe

_wspawnlpe

_tspawnv

_spawnv

_spawnv

_wspawnv

_tspawnve

_spawnve

_spawnve

_wspawnve

_tspawnvp

_spawnvp

_spawnvp

_wspawnvp

_tspawnvpe

_spawnvpe

_spawnvpe

_wspawnvpe

muss genügend Speicher zum Laden und Ausführen des neuen Prozess verfügbar sein.Das mode-Argument bestimmt die Aktion, die vom aufrufenden Prozesses und während _spawnausgeführt werden.Die folgenden Werte für mode werden in Process.h definiert:

  • _P_OVERLAY
    Überlagert einen aufrufenden Prozesses mit einem neuen Prozess und zerstört den aufrufenden Prozesses (dieselben Auswirkungen der _exec Aufrufe).

  • _P_WAIT
    Enthält einen aufrufenden Thread, bis die Ausführung des neuen Prozess abgeschlossen ist (synchrone _spawn).

  • _P_NOWAIT oder _P_NOWAITO
    Fährt fort, um einen aufrufenden Prozesses übereinstimmende mit den neuen Prozess (asynchrones _spawn) auszuführen.

  • _P_DETACH
    Fährt weiterhin den aufrufenden Prozess auszuführen; Der neue Prozess wird im Hintergrund ohne Zugriff auf die Konsole oder der Tastatur ausgeführt.Aufrufe von _cwait für den neuen Prozess schlagen fehl (asynchrones _spawn).

Das cmdname-Argument gibt die Datei an, die während der neuen Prozess ausgeführt wird und einen vollständigen Pfad vom Stammknoten () einen partiellen Pfad (im aktuellen Arbeitsverzeichnis) oder einfach einen Dateinamen angeben kann.Wenn cmdname keine Dateinamenerweiterung verfügt oder nicht mit einem Punkt (.) endet, versucht die _spawn-Funktion zuerst die Dateinamenerweiterung .com- und anschließend die .exe-Dateinamenerweiterung, die .bat-Dateinamenerweiterung und schließlich die .cmd-Dateinamenerweiterung.

Wenn cmdname eine Dateinamenerweiterung hat, werden nur diese Erweiterung verwendet wird.Wenn cmdname mit einem Punkt beendet, die _spawn Aufruf sucht cmdname ohne Dateinamenerweiterung._spawnlp, _spawnlpe, _spawnvpund_spawnvpe-Funktion für Suche ( cmdname mit dem gleichen Verfahren in Verzeichnissen), angegeben durch die Umgebungsvariable PATH .

Wenn cmdname eines Laufwerks Parameterbezeichner oder Schrägstriche enthalten ist (das heißt wenn es sich um einen relativen Pfad handelt), sucht der _spawn Aufruf nur für die angegebene Datei. Suche kein Pfad wird.

In der Vergangenheit haben einige dieser Funktionen bei Erfolg; errno auf Null das aktuelle Verhalten ist bei Erfolg, errno nicht beeinflusst, wie vom C-Standard angegeben.Wenn Sie das alte Verhalten zu emulieren möchten, stellen Sie errno auf Null unmittelbar vor dem Aufrufen dieser Funktionen.

HinweisHinweis

Um eine ordnungsgemäße Initialisierung Overlay und die Beendigung zu gewährleisten, verwenden Sie nicht die setjmp oder eine Funktion longjmp Overlay routine einzugeben oder zu lassen.

Argumente für den Vorgang erzeugte

Um die Argumente für den neuen Prozess zu übergeben, geben Sie eine oder mehrere Zeiger auf die Zeichenfolgen wie Argumente im Aufruf _spawn .Diese Zeichenfolgen besteht die Argumentliste für den erzeugten Prozess.Die kombinierte Länge der Zeichenfolgen, die die Argumentliste für den neuen Prozess besteht, darf 1024 Bytes nicht überschreiten.Das Null („\ 0 ") für jede Zeichenfolge ist nicht in der Anzahl der Leerzeichen enthalten, jedoch automatisch eingefügt, um Argumente (aufzuteilen) eingeschlossen werden.

HinweisHinweis

Die Leerzeichen, die in Zeichenfolgen enthalten sind, kann unerwartetes Verhalten verursachen. Übergeben _spawn z. B. die Zeichenfolge ergibt "hi there" den neuen Prozess, der zwei Argumente, "hi" und "there"abruft.Wenn die neuen Prozess besitzen wurde, öffnen Sie eine Datei mit dem Namen dort „Hello“ Prozess würde fehlschlagen.Sie können dies verhindern, indem Sie die Zeichenfolgen zitieren: "\"hi there\"".

SicherheitshinweisSicherheitshinweis

Führen Sie Benutzereingaben nicht explizit _spawn , ohne seinen Inhalt zu überprüfen._spawn ergibt einen Aufruf von CreateProcess . Daher sollten Sie beachten, dass nicht gekennzeichneten Pfadnamen auf potenzielle Sicherheitslücken führen.

Sie können Zeiger auf das Argument als separate Argumente übergeben (in _spawnl, in _spawnle, in _spawnlpund _spawnlpe) oder als Array von Zeigern (in _spawnv, in _spawnve, in _spawnvpund _spawnvpe).Sie müssen ein Argument, arg0 oder argv[0], zum erzeugten Prozess mindestens übergeben.Standardmäßig ist dieses Argument der Name des Programms, da sie in der Befehlszeile eingeben würden.Ein anderer Wert erzeugt keinen Fehler.

_spawnl, _spawnle, _spawnlpund _spawnlpe Aufrufe werden in der Regel verwendet, wenn die Anzahl der Argumente im Voraus bekannt.Das arg0-Argument ist normalerweise ein Zeiger auf cmdname.Die Argumente arg1 von argn sind Zeiger auf Zeichenfolgen, die die neue Argumentliste bilden.Nach argnmuss es einen NULL Zeiger zuweisen, um am Ende der Argumentliste markiert wird.

_spawnv, _spawnve, _spawnvpund _spawnvpe Aufrufe sind hilfreich, wenn sie eine variable Anzahl von Argumenten an den neuen Prozess vorhanden sind.Zeiger auf Argumente werden als Array, argvübergeben*.* Das Argument argv[0] ist normalerweise ein Zeiger auf einen Pfad im Realmodus oder dem Programmnamen im geschützten Modus und argv[1] [ argvvonn] sind Zeiger auf Zeichenfolgen, die die neue Argumentliste bilden.Das Argument argv[n +1] NULL muss ein Zeiger sein, um am Ende der Argumentliste markiert wird.

Umgebung des Prozesses erzeugten

Dateien, die geöffnet sind, wenn ein _spawn Aufruf ausgeführt wird, verbleiben im neuen Prozess geöffnet.In _spawnl, in _spawnlp, in _spawnvund _spawnvp Aufrufen erbt die neue Prozess die Umgebung des aufrufenden Prozesses.Sie können _spawnle, _spawnlpe, _spawnveund _spawnvpe Aufrufe verwenden, um die Umgebung für den neuen Prozess ändern, indem Sie eine Liste von Umgebungseinstellungen envp durch das übergebene Argument.Das Argument ist ein Array von envp Zeichenzeiger, jedes Element (mit Ausnahme der Datei, aus der das letzte Element auf eine auf NULL endende Zeichenfolge zeigt, die eine Umgebungsvariable definiert.Eine solche Zeichenfolge weist normalerweise das Formular NAME=value , in dem NAME der Name einer Umgebungsvariablen und value der Zeichenfolgenwert ist, auf den diese Variable festgelegt ist.(Beachten Sie, dass value nicht in Anführungszeichen eingeschlossen ist). Das letzte Element des Arrays sollte envpNULLsein.Wenn envp selbst NULList, erbt der erzeugte Prozess die Umgebungseinstellungen des übergeordneten Vaterprozesses.

Die _spawn-Funktionen können alle Informationen über geöffnete Dateien, einschließlich Übersetzungs den Modus zum neuen Prozess übergeben.Diese Informationen werden in Realmodus durch den C_FILE_INFO Eintrag in der Umgebung übergeben.Der Startcode verarbeitet gewöhnlich diesen Eintrag und löscht sie aus der Umgebung.Wenn jedoch eine _spawn-Funktion einen nicht--C Prozess erstellt, bleibt dieser Eintrag in der Umgebung.Die Umgebung Druckvorgang Schriftzeichen, werden in der Definitionszeichenfolge für diesen Eintrag angezeigt, da die Umweltinformation in Binärform im Realmodus übergeben wird.Er sollte keinen weiteren Auswirkungen auf Normalbetriebe haben.Klicken Sie im geschützten Modus wird die Umweltinformation Text in Form übergeben und damit keine Schriftzeichen enthalten ist.

Sie müssen jeden Datenstrom (mit leeren explizit fflush oder _flushall) oder schließen, bevor Sie eine _spawn-Funktion aufrufen.

Die neuen Prozesse, die durch Aufrufe von _spawn Routinen erstellt wurden, behalten keine Einstellungen Signal bei.Stattdessen die erzeugten rücksetzungs signal Prozess Einstellungen auf die Standardeinstellung.

Umleiten der Ausgabe

Wenn Sie _spawn aus einer DLL oder aus einer GUI-Anwendung aufrufen und die Ausgabe in eine Pipe umleiten möchten, haben Sie zwei Möglichkeiten:

  • Verwenden Sie die Win32-API, um eine Pipe zu erstellen, legen AllocConsoleAufruf der Handle Struktur und dem Start der Werte in CreateProcessim Aufruf fest.

  • Rufen Sie _popen, _wpopen , die eine Pipe erstellt und rufen Sie die Anwendung mithilfe cmd.exe /c auf (oder command.exe /c).

Beispiel

// crt_spawn.c
// This program accepts a number in the range
// 1-8 from the command line. Based on the number it receives,
// it executes one of the eight different procedures that
// spawn the process named child. For some of these procedures,
// the CHILD.EXE file must be in the same directory; for
// others, it only has to be in the same path.
//

#include <stdio.h>
#include <process.h>

char *my_env[] =
{
   "THIS=environment will be",
   "PASSED=to child.exe by the",
   "_SPAWNLE=and",
   "_SPAWNLPE=and",
   "_SPAWNVE=and",
   "_SPAWNVPE=functions",
   NULL
};

int main( int argc, char *argv[] )
{
   char *args[4];

   // Set up parameters to be sent: 
   args[0] = "child";
   args[1] = "spawn??";
   args[2] = "two";
   args[3] = NULL;

   if (argc <= 2)
   {
      printf( "SYNTAX: SPAWN <1-8> <childprogram>\n" );
      exit( 1 );
   }

   switch (argv[1][0])   // Based on first letter of argument 
   {
   case '1':
      _spawnl( _P_WAIT, argv[2], argv[2], "_spawnl", "two", NULL );
      break;
   case '2':
      _spawnle( _P_WAIT, argv[2], argv[2], "_spawnle", "two", 
               NULL, my_env );
      break;
   case '3':
      _spawnlp( _P_WAIT, argv[2], argv[2], "_spawnlp", "two", NULL );
      break;
   case '4':
      _spawnlpe( _P_WAIT, argv[2], argv[2], "_spawnlpe", "two", 
                NULL, my_env );
      break;
   case '5':
      _spawnv( _P_OVERLAY, argv[2], args );
      break;
   case '6':
      _spawnve( _P_OVERLAY, argv[2], args, my_env );
      break;
   case '7':
      _spawnvp( _P_OVERLAY, argv[2], args );
      break;
   case '8':
      _spawnvpe( _P_OVERLAY, argv[2], args, my_env );
      break;
   default:
      printf( "SYNTAX: SPAWN <1-8> <childprogram>\n" );
      exit( 1 );
   }
   printf( "from SPAWN!\n" );
}
  

Siehe auch

Referenz

Prozess- und Umgebungssteuerelement

Abbruch

atexit

_exec, _wexec Funktionen

Beenden, _exit

_flushall

_getmbcp

_onexit, _onexit_m

_setmbcp

System, _wsystem