Sdílet prostřednictvím


_spawn, _wspawn – funkce

Každý _spawn funkce vytvoří a spustí nový proces:

_spawnl, _wspawnl

_spawnv, _wspawnv

_spawnle, _wspawnle

_spawnve, _wspawnve

_spawnlp, _wspawnlp

_spawnvp, _wspawnvp

_spawnlpe, _wspawnlpe

_spawnvpe, _wspawnvpe

Písmena na konci názvu funkce zjistit odchylky.

  • e
    envp, matice ukazatelů pro nastavení prostředí, je předán nový proces.

  • l
    Argumenty příkazového řádku jsou funkci _spawn předány jednotlivě.Tato přípona se obvykle používá, pokud počet parametrů nového procesu je předem známo.

  • p
    Proměnná prostředí PATH slouží k vyhledání souboru, který chcete spustit.

  • v
    argv, matice ukazatelů pro argumenty příkazového řádku, je předána _spawn funkce.Tato přípona se obvykle používá, pokud počet parametrů nového procesu je proměnná.

Poznámky

_spawn Funkce každý vytvořit a spustit nový proces.Zpracovával tyto argumenty řetězec vícebajtových znaků podle potřeby, uznávajíce vícebajtové znakové sekvence podle vícebajtová znaková stránka aktuálně používán._wspawn Funkce jsou verze širokého znaku _spawn funkce; neukládají vícebajtové znakové řetězce.Jinak _wspawn funkce se chovají stejně jako jejich _spawn protějšky.

Rutinní mapování obecného textu

Rutina Tchar.h

_UNICODE a _MBCS nejsou definovány

_MBCS definováno

_UNICODE definováno

_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

Nedostatek paměti, musí být k dispozici pro načtení a spuštění nového procesu.mode Argument určuje akci, kterou volající proces před a během _spawn.Následující hodnoty pro mode jsou definovány v Process.h:

  • _P_OVERLAY
    Překrytí a volání zpracovat nový proces, zničení volající proces (stejný vliv jako _exec volání).

  • _P_WAIT
    Pozastaví volající vlákno, dokud nebude dokončeno spuštění nového procesu (synchronní _spawn).

  • _P_NOWAIT nebo _P_NOWAITO
    Bude pokračovat v provádění volající proces současně nový proces (asynchronní _spawn).

  • _P_DETACH
    Bude pokračovat v provádění procesu volajícího. Nový proces je spuštěn na pozadí bez přístupu konzoly nebo z klávesnice.Volání _cwait proti nový proces nezdaří (asynchronní _spawn).

cmdname Argument určuje soubor, který je spuštěn jako nový proces a můžete zadat úplnou cestu (z kořenového adresáře), část cesty (z aktuálního pracovního adresáře) nebo pouze název souboru.Pokud cmdname nemá příponu názvu souboru nebo na konci tečku (.) _spawn funkce nejprve pokusí příponou .com a potom příponu názvu souboru .exe soubory s příponou BAT a nakonec příponu CMD..

Pokud cmdname má příponu názvu souboru, pouze použita přípona.Pokud cmdname končí tečkou, _spawn volání vyhledávání cmdname s bez přípony názvu souboru._spawnlp, _spawnlpe, _spawnvp, A _spawnvpe funkce Hledat cmdname (stejným způsobem) do adresáře určené PATH proměnné prostředí.

Pokud cmdname obsahuje specifikátor jednotku nebo libovolné lomítka (Pokud se jedná o relativní cestu), _spawn volat pouze vyhledá zadaný soubor; Probíhá hledání žádná cesta.

V minulosti, některé z těchto funkcí sady errno na nulu na úspěch; aktuální chování je ponechat errno na úspěch podle standardu C beze změny.Pokud potřebujete emulovat staré chování, nastavte errno na nulu před volání těchto funkcí.

[!POZNÁMKA]

Zajistit řádné překrytí inicializační a ukončovcí nepoužívejte setjmp nebo longjmp funkce vplout do nebo odplout rutiny překrytí.

Argumenty pro vytvářený proces

Nový proces předání argumentů, dát jednoho nebo více ukazatelů řetězce znaků jako argumenty v _spawn volání.Tyto řetězce znaků tvoří seznam argumentů pro proces spuštěný.Celková délka řetězce tvoří seznam argumentů pro nový proces nesmí překročit 1 024 bajtů.Ukončující znak null ('\0') pro každý řetězec není v počtu zahrnuty, ale jsou zahrnuty znaky (automaticky vložen do samostatných argumentů).

[!POZNÁMKA]

Mezery vložené do řetězců mohou způsobit neočekávané chování, například výsledkem předání řetězce "hi there" funkci _spawn bude nový proces, který získá dva argumenty "hi" a "there".Proces selže, pokud bylo záměrem, aby nový proces otevřel soubor s názvem "hi there".Tomu lze zabránit citováním řetězce: "\"hi there\"".

Poznámka k zabezpečeníPoznámka k zabezpečení

Nepředávejte funkci _spawn vstup uživatele bez explicitní kontroly jeho obsahu.Výsledkem funkce _spawn bude volání funkce CreateProcess, tak mějte na paměti, že neúplné názvy cest mohou vést k potenciálním zranitelnostem zabezpečení.

Argument ukazatele můžete předat argumenty jako samostatné (v _spawnl, _spawnle, _spawnlp, a _spawnlpe) nebo jako pole ukazatelů (v _spawnv, _spawnve, _spawnvp, a _spawnvpe).Musí uplynout alespoň jeden argument, arg0 nebo argv[0], chcete-li proces spuštěný.Úmluvou tento argument je název programu, jako by jej zadejte na příkazovém řádku.Jinou hodnotu nevytvoří chybu.

_spawnl, _spawnle, _spawnlp, A _spawnlpe volání se obvykle používají v případech, kde je předem znám počet argumentů.Argument arg0 je obvykle ukazatel na cmdname.Argumenty arg1 až argn jsou ukazatele na znakové řetězce tvořící nový seznam argumentů.Po argn musí následovat ukazatel NULL pro označení konce seznamu argumentů.

_spawnv, _spawnve, _spawnvp, A _spawnvpe volání jsou užitečné, když je proměnný počet argumentů pro nový proces.Odkazy na argumenty jsou předány jako matici, argv*.* Argument argv[0] je obvykle ukazatel na cestu v reálném režimu nebo na název programu v chráněném režimu a argv[1] až argv[n] jsou ukazatele na znakové řetězce tvořící nový seznam argumentů.Argument argv[n + 1] musí být ukazatel NULL pro označení konce seznamu argumentů.

Prostředí proces spuštěný

Soubory, které jsou při otevření _spawn je provedeno volání otevřít v novém procesu zůstat.V _spawnl, _spawnlp, _spawnv, a _spawnvp volání, nový proces zdědí prostředí volajícího procesu.Lze použít _spawnle, _spawnlpe, _spawnve, a _spawnvpe ke změně prostředí nový proces tím, že předáte seznam nastavení prostředí prostřednictvím volání envp argument.Argument envp je pole znaků ukazatelů, každý prvek (s výjimkou poslední prvek), které odkazuje na řetězec zakončený hodnotou null, definování proměnné prostředí.Takový řetězec má obvykle tvar NAME=value, kde NAME je název proměnné prostředí a value je hodnota řetězce, na kterou je tato proměnná nastavena. (Všimněte si, že value není uzavřeno v dvojitých uvozovkách.) Poslední prvek pole envp by měl být NULL.Při envp je NULL, vytvářený proces zdědí nastavení prostředí nadřazeného procesu.

_spawn Funkce můžete předat veškeré informace o otevřených souborech, včetně režim překladu, na nový proces.Tyto informace jsou předány v reálném režimu až C_FILE_INFO položka v životním prostředí.Spouštěcí kód obvykle zpracovává tuto položku a pak odstraní z prostředí.Nicméně pokud _spawn funkce založí proces než C, tato položka zůstane v prostředí.Tisk prostředí ukazuje řetězec definice pro tuto položku grafické znaky, protože prostředí informace je předána v binárním formátu v reálném režimu.By neměl mít vliv na normální provoz.Informace o prostředí v chráněném režimu je předán v textové podobě a proto neobsahuje žádné grafické znaky.

Musíte explicitně flush (pomocí fflush nebo _flushall) nebo zavřít všechny proudu před volací _spawn funkce.

Nové procesy vytvořené voláním _spawn rutiny nezachová nastavení signálu.Místo toho proces spuštěný obnoví nastavení výchozí.

Přesměrování výstupu

Při volání _spawn z knihovny DLL nebo grafického uživatelského rozhraní aplikace a chcete přesměrovat výstup do kanálu, máte dvě možnosti:

  • Pomocí rozhraní API systému Win32 k vytvoření kanálu, volejte AllocConsole, popisovač hodnoty nastavit spuštění strukturu a volání CreateProcess.

  • Volání _popen, _wpopen který vytvoří kanálu a vyvolat pomocí aplikace cmd.exe /c (nebo command.exe /c).

Příklad

// 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" );
}
  

Viz také

Referenční dokumentace

Řízení procesů a prostředí

abort

atexit

_exec, _wexec – funkce

exit, _exit

_flushall

_getmbcp

_onexit, _onexit_m

_setmbcp

system, _wsystem