_exec funkce _wexec
Každá funkce této řady načte a spustí nový proces:
Písmeno na konci názvu funkce Určuje změnu.
přípona _exec funkce |
Description |
---|---|
e |
envp, pole ukazatelů nastavení prostředí je předán nový proces. |
l |
Argumenty příkazového řádku jsou předána jednotlivě na _exec funkce.Obvykle se používá, pokud počet parametrů procesu je předem známo. |
p |
PATHproměnné prostředí lze najít soubor spustit. |
v |
argv, pole ukazatelů argumenty příkazového řádku, je předána _exec.Obvykle se používá při počet parametrů procesu je proměnná. |
Poznámky
Každý _exec funkce načte a spustí nový proces.Všechny _exec funkce používají stejnou funkci operačního systému (CreateProcess)._exec Funkce automaticky zpracovat řetězec vícebajtových znaků argumenty případně UZNÁVAJÍCE vícebajtové znakové sekvence podle vícebajtové znakové stránky právě používán._wexec Jsou funkce verze celého znaku _exec funkcí._wexec Funkce chovají identicky na jejich _exec řady protějšky, zpracovávají vícebajtové znakové řetězce.
Obecný Text rutinní mapování
Rutina Tchar.h |
_UNICODE a _MBCS není definován |
_MBCS, definice |
_UNICODE, definice |
---|---|---|---|
_texecl |
_execl |
_execl |
_wexecl |
_texecle |
_execle |
_execle |
_wexecle |
_texeclp |
_execlp |
_execlp |
_wexeclp |
_texeclpe |
_execlpe |
_execlpe |
_wexeclpe |
_texecv |
_execv |
_execv |
_wexecv |
_texecve |
_execve |
_execve |
_wexecve |
_texecvp |
_execvp |
_execvp |
_wexecvp |
_texecvpe |
_execvpe |
_execvpe |
_wexecvpe |
cmdname Parametr určuje soubor, který má být spuštěn jako nový proces.Můžete určit, úplnou cestu (z kořenového adresáře), částečnou cestu (z aktuální pracovní adresář) nebo název souboru.Pokud cmdname nemá příponu názvu souboru nebo na konci tečku (.) _exec funkce vyhledá v souboru s názvem.Pokud je hledání neúspěšné, pokusí se stejným základním názvem s příponou .com a s exe, BAT a CMD bez přípony.Pokud cmdname má příponu názvu souboru se používá pouze rozšíření v hledání.Pokud cmdname končí období, _exec vyhledá funkce cmdname žádný soubor s příponou._execlp, _execlpe, _execvp, a _execvpe Hledat cmdname (pomocí stejných postupů) v adresářích určených PATH proměnné prostředí.Pokud cmdname obsahuje specifikátor jednotky nebo jakékoli lomítka (Pokud je relativní cesty), _exec volání hledá pouze zadaný soubor; cesta není prohledána.
Parametry jsou předány nový proces přiřazením jednoho nebo více ukazatelů jako parametry ve znakových řetězců _exec volání.Tyto řetězce znaků formulář seznamu parametrů pro nový proces.Celková délka prostředí zděděné nastavení a řetězců tvořících seznam parametrů pro nový proces nesmí být větší než 32 kB.Ukončujícím znakem null (\0) pro každý řetězec není v počtu zahrnuty, ale jsou počítány znaky (automaticky vložen do samostatných parametry).
[!POZNÁMKA]
Mezery vložené řetězce může způsobit neočekávané chování; například předávání _exec řetězec "hi there" výsledkem bude nový proces získávání dva argumenty "hi" a "there".Pokud bylo záměrem mít nový proces, otevřete soubor s názvem "hi tam", by nezdaří.Tomu lze zabránit odkázali řetězec: "\"hi there\"".
![]() |
---|
Nepředá vstup uživatele na _exec bez explicitně kontroly jeho obsahu._execVýsledkem bude volání CreateProcess tak mějte na paměti cestu neúplných názvů může vést k možnými chybami zabezpečení. |
_exec Funkce ověřit jejich parametrů.Pokud jsou parametry ukazatele s hodnotou null, prázdné řetězce nebo vynechán, _exec funkce vyvolat obslužnou rutinu neplatný parametr, jak je popsáno v Ověření parametrů.Pokud je povoleno spuštění pokračovat, nastavit tyto funkce errno na EINVAL a vrátí -1.Žádný nový proces je spuštěn.
Argument ukazatele mohou být předány jako samostatné parametry (v _execl, _execle, _execlp, a _execlpe) nebo jako matici ukazatele (v _execv, _execve, _execvp, a _execvpe).Nejméně jeden parametr arg0, musí být předány do nového procesu; Tento parametr je argv[0] nový proces.Tento parametr je obvykle kopie cmdname.(Jinou hodnotu nevytvářejí chybě.)
_execl, _execle, _execlp, A _execlpe volání se obvykle používají, pokud počet parametrů je předem známo.Parametr arg0 je obvykle ukazatel na cmdname.Parametry arg1 prostřednictvím argn příkaz tvořící nový parametr seznam řetězců znaků.Musí následovat ukazatel s hodnotou null argn na konec seznamu parametrů.
_execv, _execve, _execvp, A _execvpe volání jsou užitečná, když počet parametrů procesu je proměnná.Ukazatele na parametry jsou předány jako matice, argv.Parametr argv[0] je obvykle ukazatel na cmdname.Parametry argv[1] prostřednictvím argvn příkaz tvořící nový parametr seznam řetězců znaků.Parametr argvn+ 1] musí být NULL ukazatel na konec seznamu parametrů.
Otevřít soubory, které jsou, kdy _exec hovoru zůstávají otevřené v novém procesu.V _execl, _execlp, _execv, a _execvp volání nový proces zdědí prostředí volajícího procesu._execle, _execlpe, _execve, a _execvpe volání změnit prostředí pro nový proces předáním seznam nastavení prostředí až envp parametr.envpKaždý prvek, jehož (kromě pro poslední prvek) odkazuje na řetězec zakončený pole znak ukazatele definuje proměnné prostředí.Tyto řetězce obvykle má tvar NAME=value kde NAME je název proměnné prostředí a value je hodnota řetězce, které tato proměnná nastavena.(Všimněte si, že value není uzavřena v uvozovkách.) Poslední prvek envp pole by měla být NULL.Při envp je NULL, nový proces zdědí nastavení prostředí volajícího procesu.
Program provedeny s jedním z _exec funkce vždy načten do paměti, jako by byla maximální přidělení pole v záhlaví souboru EXE programu nastavena na výchozí hodnotu 0xFFFFH.
_exec Volání nezachovávají režimy překlad otevřených souborů.Pokud nový proces musí zděděné z volající proces soubory, použijte _setmode rutina požadovaný režim nastavení režimu převodu těchto souborů.Explicitně flush (pomocí fflush nebo _flushall) nebo zavřít všechny proudu před _exec volání funkce.Není zachováno nastavení signálu v nové procesy, které jsou vytvořeny volání na _exec rutiny.Nastavení signálu se obnovit výchozí v novém procesu.
Příklad
// crt_args.c
// Illustrates the following variables used for accessing
// command-line arguments and environment variables:
// argc argv envp
// This program will be executed by crt_exec which follows.
#include <stdio.h>
int main( int argc, // Number of strings in array argv
char *argv[], // Array of command-line argument strings
char **envp ) // Array of environment variable strings
{
int count;
// Display each command-line argument.
printf( "\nCommand-line arguments:\n" );
for( count = 0; count < argc; count++ )
printf( " argv[%d] %s\n", count, argv[count] );
// Display each environment variable.
printf( "\nEnvironment variables:\n" );
while( *envp != NULL )
printf( " %s\n", *(envp++) );
return;
}
Spusťte Crt_args.exe spustit následující program:
// crt_exec.c
// Illustrates the different versions of exec, including
// _execl _execle _execlp _execlpe
// _execv _execve _execvp _execvpe
//
// Although CRT_EXEC.C can exec any program, you can verify how
// different versions handle arguments and environment by
// compiling and specifying the sample program CRT_ARGS.C. See
// "_spawn, _wspawn Functions" for examples of the similar spawn
// functions.
#include <stdio.h>
#include <conio.h>
#include <process.h>
char *my_env[] = // Environment for exec?e
{
"THIS=environment will be",
"PASSED=to new process by",
"the EXEC=functions",
NULL
};
int main( int ac, char* av[] )
{
char *args[4];
int ch;
if( ac != 3 ){
fprintf( stderr, "Usage: %s <program> <number (1-8)>\n", av[0] );
return;
}
// Arguments for _execv?
args[0] = av[1];
args[1] = "exec??";
args[2] = "two";
args[3] = NULL;
switch( atoi( av[2] ) )
{
case 1:
_execl( av[1], av[1], "_execl", "two", NULL );
break;
case 2:
_execle( av[1], av[1], "_execle", "two", NULL, my_env );
break;
case 3:
_execlp( av[1], av[1], "_execlp", "two", NULL );
break;
case 4:
_execlpe( av[1], av[1], "_execlpe", "two", NULL, my_env );
break;
case 5:
_execv( av[1], args );
break;
case 6:
_execve( av[1], args, my_env );
break;
case 7:
_execvp( av[1], args );
break;
case 8:
_execvpe( av[1], args, my_env );
break;
default:
break;
}
// This point is reached only if exec fails.
printf( "\nProcess was not execed." );
exit( 0 );
}
.Ekvivalent rozhraní.
Záhlaví: process.h