Sdílet prostřednictvím


_spawn, _wspawn funkce

Každá z _spawn těchto funkcí vytvoří a spustí nový proces:

_spawnl, _wspawnl
_spawnle, _wspawnle
_spawnlp, _wspawnlp
_spawnlpe, _wspawnlpe
_spawnv, _wspawnv
_spawnve, _wspawnve
_spawnvp, _wspawnvp
_spawnvpe, _wspawnvpe

Písmena na konci názvu funkce určují variantu.

Dopis Varianta
e envp, pole ukazatelů na nastavení prostředí se předává novému procesu.
l Argumenty příkazového řádku jsou funkci _spawn předány jednotlivě. Tato přípona se obvykle používá, když jsou některé parametry pro nový proces známé předem.
p Proměnná prostředí PATH slouží k vyhledání souboru, který chcete spustit.
v argv, pole ukazatelů na argumenty příkazového řádku se předává funkci _spawn . Tato přípona se obvykle používá, když je proměnných několik parametrů nového procesu.

Poznámky

Všechny _spawn funkce vytvoří a spustí nový proces. Podle potřeby automaticky zpracovávají vícebajtové řetězcové argumenty a rozpoznávají vícebajtové sekvence znaků podle aktuálně používané znakové stránky s vícebajty. Funkce _wspawn jsou širokoznakové verze _spawn funkcí. Nezpracovávají řetězce vícebajtových znaků. V opačném případě se _wspawn funkce chovají stejně jako jejich _spawn protějšky.

Mapování rutin obecného textu

Tchar.h Rutinní _UNICODE a _MBCS není definován _MBCS Definovány _UNICODE Definovány
_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

Pro načtení a spuštění nového procesu musí být k dispozici dostatek paměti. Argument mode určuje akci prováděnou volajícím procesem před a během _spawn. Následující hodnoty jsou mode definovány v Process.h:

Hodnota popis
_P_OVERLAY Překryjí volající proces novým procesem a zničí volající proces (stejný účinek jako _exec volání).
_P_WAIT Pozastaví volající vlákno, dokud nebude dokončeno provádění nového procesu (synchronní _spawn).
_P_NOWAIT nebo _P_NOWAITO Pokračuje v provádění volajícího procesu souběžně s novým procesem (asynchronní _spawn).
_P_DETACH Pokračuje v provádění volajícího procesu; Nový proces se spouští na pozadí bez přístupu ke konzole nebo klávesnici. _cwait Volání proti selhání nového procesu (asynchronní_spawn).

Argument cmdname určuje soubor, který se spustí jako nový proces, a může zadat úplnou cestu (z kořenového adresáře), částečnou cestu (z aktuálního pracovního adresáře) nebo jenom název souboru. Pokud cmdname nemá příponu názvu souboru nebo nekončí tečkou (.), _spawn funkce nejprve vyzkouší příponu názvu souboru .com a pak příponu názvu souboru .exe, příponu názvu souboru .bat a nakonec příponu názvu souboru .cmd.

Pokud cmdname má příponu názvu souboru, použije se pouze tato přípona. Pokud cmdname končí tečkou, _spawn volání vyhledá cmdname bez přípony názvu souboru. Funkce _spawnlp, _spawnlpe, _spawnvpa _spawnvpe hledat cmdname (pomocí stejných procedur) v adresářích určených proměnnou PATH prostředí.

Pokud cmdname obsahuje specifikátor jednotky nebo všechna lomítka (tj. pokud jde o relativní cestu), _spawn volání vyhledá pouze zadaný soubor. Hledání cesty se neprovede.

V minulosti některé z těchto funkcí nastavily errno na nulu při úspěchu; aktuální chování je ponechat errno nedotčené při úspěchu, jak je určeno standardem jazyka C. Pokud potřebujete napodobit staré chování, před voláním těchto funkcí nastavte errno na nulu.

Poznámka

Chcete-li zajistit správné inicializace a ukončení překrytí, nepoužívejte setjmp funkci longjmp k zadání nebo opuštění překryvné rutiny.

Argumenty pro vytvářený proces

Chcete-li předat argumenty novému procesu, dejte jeden nebo více ukazatelů na řetězce znaků jako argumenty ve _spawn volání. Tyto řetězce znaků tvoří seznam argumentů pro vytvářený proces. Kombinovaná délka řetězců tvořících seznam argumentů pro nový proces nesmí překročit 1024 bajtů. Ukončující znak null (\0) pro každý řetězec není zahrnut do počtu, ale zahrnou se mezery (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 _spawn funkci "hi there" 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\"".

Důležité

Nepředávejte funkci _spawn vstup uživatele bez explicitní kontroly jeho obsahu. _spawn výsledkem volání CreateProcess , aby si uvědomte, že nekvalifikované názvy cest by mohly vést k potenciálním ohrožením zabezpečení.

Ukazatele argumentů můžete předat jako samostatné argumenty (v _spawnl_spawnle, , _spawnlpa _spawnlpe) nebo jako pole ukazatelů (in _spawnv, _spawnve, _spawnvpa _spawnvpe). Do vytvářeného procesu musíte předat alespoň jeden argument nebo arg0argv[0]. Podle konvence je tento argument názvem programu tak, jak byste ho zadali na příkazovém řádku. Jiná hodnota nevygeneruje chybu.

Volání _spawnl, _spawnlea _spawnlp_spawnlpe jsou obvykle používány v případech, kdy je počet argumentů známý předem. Argument arg0 je obvykle ukazatel na cmdname. Argumenty arg1 jsou argn ukazatele na řetězce znaků tvořící nový seznam argumentů. V následujícím argnpříkladu NULL musí být ukazatel, který označí konec seznamu argumentů.

Volání _spawnv, _spawnve_spawnvpa _spawnvpe jsou užitečné, pokud existuje proměnný počet argumentů nového procesu. Ukazatele na argumenty jsou předány jako pole, argv.argv[0] Argument 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] prostřednictvím argv[n] jsou ukazatele na řetězce znaků tvořící nový seznam argumentů. argv[n +1] Argument musí být NULL ukazatel pro označení konce seznamu argumentů.

Prostředí vytvářeného procesu

Soubory, které se otevřou _spawn při volání, zůstanou v novém procesu otevřené. V sadě _spawnl, _spawnlp, _spawnva _spawnvp volání, nový proces dědí prostředí volajícího procesu. Pomocí příkazu _spawnle, , _spawnlpe_spawnvea _spawnvpe volání změnit prostředí pro nový proces předáním seznamu nastavení prostředí prostřednictvím argumentuenvp. envp Argument je pole ukazatelů znaků, každý prvek (s výjimkou konečného elementu), jehož odkazuje na řetězec ukončený hodnotou null definující proměnnou prostředí. Takový řetězec má obvykle tvar NAME=value , kde NAME je název proměnné prostředí a value je řetězcová hodnota, na kterou je tato proměnná nastavena. (Není value uzavřená do dvojitých uvozovek.) Posledním prvkem envp pole by měl být NULL. Když envp je NULLsám o sobě , vytvářený proces dědí nastavení prostředí nadřazeného procesu.

Funkce _spawn můžou novému procesu předat všechny informace o otevřených souborech, včetně režimu překladu. Tyto informace se předávají v reálném režimu prostřednictvím C_FILE_INFO položky v prostředí. Spouštěcí kód obvykle tuto položku zpracuje a pak ji odstraní z prostředí. Pokud _spawn ale funkce vytvoří proces, který není C, zůstane tato položka v prostředí. Tisk prostředí zobrazuje grafické znaky v definičním řetězci pro tuto položku, protože informace o prostředí se předávají v binární podobě v reálném režimu. Nemělo by to mít žádný jiný vliv na normální operace. V chráněném režimu se informace o prostředí předávají v textové podobě, a proto neobsahují žádné grafické znaky.

Před voláním _spawn funkce je nutné explicitně vyprázdnit (pomocí fflush nebo_flushall) nebo zavřít jakýkoli datový proud.

Nové procesy vytvořené voláním _spawn rutin nezachovají nastavení signálu. Místo toho vytvářený proces resetuje nastavení signálu na výchozí.

Přesměrování výstupu

Pokud voláte _spawn z knihovny DLL nebo grafického uživatelského rozhraní a chcete přesměrovat výstup na kanál, máte dvě možnosti:

  • Pomocí rozhraní API Win32 vytvořte kanál, potom volání AllocConsole, nastavte hodnoty popisovače ve struktuře spuštění a volání CreateProcess.

  • Volání _popen nebo _wpopen, který vytvoří kanál a vyvolá aplikaci pomocí 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" );
}
child process output
from SPAWN!

Viz také

Řízení procesů a prostředí
abort
atexit
_exec, _wexec funkce
exit, _Exit, _exit
_flushall
_getmbcp
_onexit, _onexit_m
_setmbcp
system, _wsystem