Sdílet prostřednictvím


_exec, _wexec Funkce

Každá funkce této rodiny načte a spustí nový proces:

Písmeno na konci názvu funkce určuje variantu.

_exec přípona funkce Popis
e envp, pole ukazatelů na nastavení prostředí se předává novému procesu.
l Argumenty příkazového řádku jsou funkci _exec předány jednotlivě. Obvykle se používají, pokud je počet parametrů nového procesu předem známý.
p Proměnná prostředí PATH slouží k vyhledání souboru, který chcete spustit.
v argv, pole ukazatelů na argumenty příkazového řádku, je předáno _exec. Obvykle se používá, pokud je počet parametrů nového procesu proměnný.

Poznámky

Každá funkce _exec načte a spustí nový proces. Všechny _exec funkce používají stejnou funkci operačního systému (CreateProcess). Funkce _exec automaticky zpracují argumenty vícebajtových řetězců znaků podle potřeby a rozpoznají vícebajtové sekvence znaků podle aktuálně použité vícebajtové znakové stránky. Funkce _wexec jsou širokoznaké verze funkcí _exec. Funkce _wexec se chovají stejně jako jejich _exec rodinné protějšky s tím rozdílem, že nezpracují řetězce s vícebajtovými znaky.

Mapování rutin obecného textu

Tchar.h rutina _UNICODE a _MBCS není definován _MBCS definovaný _UNICODE definovaný
_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

Parametr cmdname určuje soubor, který má být spuštěn jako nový proces. Lze zadat úplnou cestu (z kořenového adresáře), část cesty (z aktuálního pracovního adresáře) nebo název souboru. Pokud cmdname nemá příponu názvu souboru nebo nekončí tečkou (.), _exec funkce vyhledá pojmenovaný soubor. Pokud je hledání neúspěšné, pokusí se vyhledat stejný základní název s příponou názvu souboru .com a poté .exe, .bat a .cmd. Pokud má parametr cmdname příponu názvu souboru, je pro hledání použita pouze tato přípona. Pokud parametr cmdname končí tečkou, vyhledá funkce _exec parametr cmdname bez přípony názvu souboru. Funkce _execlp, _execlpe, _execvp a _execvpe hledají parametr cmdname (stejným způsobem) v adresářích určených proměnnou prostředí PATH. Pokud cmdname obsahuje specifikátor jednotky nebo všechna lomítka (tj. pokud jde o relativní cestu), _exec volání vyhledá pouze zadaný soubor; cesta se nevyhledává.

Parametry jsou novému procesu předány jedním nebo více ukazateli na řetězce znaků jako parametry volání funkce _exec. Tyto řetězce znaků tvoří seznam parametrů nového procesu. Celková délka zděděného nastavení prostředí a řetězců tvořících seznam parametrů nového procesu nesmí překročit 32 kB. Ukončovací NULL znak (\0) pro každý řetězec není zahrnut v počtu, ale započítávají se mezery (vložené automaticky k oddělení parametrů).

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 _exec 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 _exec vstup uživatele bez explicitní kontroly jeho obsahu. _exec 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í.

Funkce _exec ověřují své parametry. Pokud jsou očekávané parametry ukazatele null, prázdné řetězce nebo vynechány, _exec funkce vyvolat neplatnou obslužnou rutinu parametru, jak je popsáno v ověření parametru. Pokud je spuštění povoleno pokračovat, tyto funkce jsou nastavené errno na EINVAL hodnotu -1 a vrátí hodnotu -1. Nespustí se žádný nový proces.

Ukazatelé na argumenty mohou být předány jako oddělené parametry (ve funkcích _execl, _execle, _execlp a _execlpe) nebo jako pole ukazatelů (ve funkcích _execv, _execve, _execvp a _execvpe). Alespoň jeden parametr , arg0musí být předán do nového procesu; tento parametr je argv[0] nového procesu. Tento parametr je obvykle kopií parametru cmdname. (Jiná hodnota negeneruje chybu.)

Volání funkcí _execl, _execle, _execlp a _execlpe se obvykle používají, pokud je počet parametrů předem známý. Parametr arg0 je obvykle ukazatel na parametr cmdname. Parametry arg1argn odkazují na řetězce znaků, které tvoří nový seznam parametrů. Nulový ukazatel musí následovat parametr argn, což označuje konec seznamu parametrů.

Volání funkcí _execv, _execve, _execvp a _execvpe jsou užitečná, když je počet parametrů nového procesu proměnný. Odkazy na parametry jsou předány jako pole argv. Parametr argv[0] je obvykle ukazatel na parametr cmdname. Parametry argv[1]argv[n] odkazují na řetězce znaků, které tvoří nový seznam parametrů. argv[n+1] Parametr musí být NULL ukazatel pro označení konce seznamu parametrů.

Soubory, které jsou při volání funkce _exec otevřeny, zůstanou v novém procesu otevřeny. Při volání funkcí _execl, _execlp, _execv a _execvp nový proces zdědí prostředí volajícího procesu. Volání funkcí _execle, _execlpe, _execve a _execvpe změní prostředí nového procesu tím, že předají seznam nastavení prostředí pomocí parametru envp. Parametr envp je pole ukazatelů na znaky, kde každý prvek (s výjimkou posledního prvku) odkazuje na hodnotu null ukončující řetězec 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ě , nový proces dědí nastavení prostředí volajícího procesu.

Program spuštěný s jednou z _exec funkcí se vždy načte do paměti, jako kdyby bylo pole maximálního přidělení v hlavičce souboru .exe programu nastaveno na výchozí hodnotu 0xFFFFH.

Volání _exec nezachovávají režimy překladu otevřených souborů. Pokud nový proces musí používat soubory zděděné z volajícího procesu, použijte rutinu _setmode k nastavení režimu překladu těchto souborů do požadovaného režimu. Je nutné provést explicitní vyprázdnění (pomocí funkce fflush nebo _flushall) nebo všechny proudy zavřít před voláním funkce _exec. Nastavení signálu se nezachovávají v nových procesech vytvořených voláními rutin _exec . Nastavení signálu je v novém procesu obnoveno na výchozí hodnotu.

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;
}

Pro spuštění programu Crt_args.exe spusťte 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 );
}

Požadavky

Záhlaví: process.h

Viz také

Řízení procesů a prostředí
abort
atexit
exit, , _Exit_exit
_onexit, _onexit_m
_spawn, _wspawn funkce
system, _wsystem