_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.
Letter | 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 rutina |
_UNICODE a _MBCS není definován |
_MBCS definovaný |
_UNICODE definovaný |
---|---|---|---|
_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 nejdřív 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
, _spawnvp
a _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
, , _spawnlp
a _spawnlpe
) nebo jako pole ukazatelů (in _spawnv
, _spawnve
, _spawnvp
a _spawnvpe
). Do vytvářeného procesu musíte předat alespoň jeden argument nebo arg0
argv[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
, _spawnle
a _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 argn
příkladu NULL
musí být ukazatel, který označí konec seznamu argumentů.
Volání _spawnv
, _spawnve
_spawnvp
a _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
, _spawnv
a _spawnvp
volání, nový proces dědí prostředí volajícího procesu. Pomocí příkazu _spawnle
, , _spawnlpe
_spawnve
a _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 NULL
sá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
(nebocommand.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