Udostępnij za pośrednictwem


_exec, _wexec Funkcje

Każda funkcja w tej rodzinie ładuje i wykonuje nowy proces:

Litera na końcu nazwy funkcji określa odmianę.

_exec sufiks funkcji opis
e envp, tablica wskaźników do ustawień środowiska, jest przekazywana do nowego procesu.
l Argumenty wiersza polecenia są przekazywane indywidualnie do _exec funkcji. Zwykle używane, gdy liczba parametrów nowego procesu jest znana z wyprzedzeniem.
p PATH zmienna środowiskowa służy do znajdowania pliku do wykonania.
v argv, tablica wskaźników do argumentów wiersza polecenia, jest przekazywana do _exec. Zwykle używane, gdy liczba parametrów nowego procesu jest zmienna.

Uwagi

Każda _exec funkcja ładuje i wykonuje nowy proces. Wszystkie _exec funkcje używają tej samej funkcji systemu operacyjnego (CreateProcess). Funkcje _exec automatycznie obsługują odpowiednio argumenty ciągu wielobajtowego, rozpoznając sekwencje znaków wielobajtowych zgodnie ze stroną kodową wielobajtową, która jest obecnie używana. Funkcje _wexec to wersje _exec funkcji o szerokim charakterze. Funkcje _wexec zachowują się identycznie z ich _exec odpowiednikami rodzinnymi, z tą różnicą, że nie obsługują ciągów wielobajtowych znaków.

Mapowania procedur tekstu ogólnego

Tchar.h rutyna _UNICODE i _MBCS niezdefiniowane _MBCS zdefiniowany _UNICODE zdefiniowany
_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 określa plik, który ma zostać wykonany jako nowy proces. Może określać pełną ścieżkę (z katalogu głównego), ścieżkę częściową (z bieżącego katalogu roboczego) lub nazwę pliku. Jeśli cmdname nie ma rozszerzenia nazwy pliku lub nie kończy się kropką (.), _exec funkcja wyszukuje nazwany plik. Jeśli wyszukiwanie zakończy się niepowodzeniem, spróbuje użyć tej samej nazwy podstawowej z rozszerzeniem nazwy pliku .com, a następnie przy użyciu .exe, .bat i rozszerzeń nazw plików .cmd. Jeśli cmdname ma rozszerzenie nazwy pliku, tylko to rozszerzenie jest używane w wyszukiwaniu. Jeśli cmdname kończy się kropką, _exec funkcja wyszukuje cmdname bez rozszerzenia nazwy pliku. _execlp, , _execvp_execlpei _execvpe wyszukaj cmdname (przy użyciu tych samych procedur) w katalogach określonych przez zmienną środowiskowąPATH. Jeśli cmdname zawiera specyfikator dysku lub jakiekolwiek ukośniki (oznacza to, że jest to ścieżka względna), _exec wywołanie wyszukuje tylko określony plik; ścieżka nie jest przeszukiwana.

Parametry są przekazywane do nowego procesu przez podanie co najmniej jednego wskaźnika do ciągów znaków jako parametrów w wywołaniu _exec . Te ciągi znaków tworzą listę parametrów dla nowego procesu. Łączna długość dziedziczonego środowiska i ciągi tworzące listę parametrów dla nowego procesu nie mogą przekraczać 32 kilobajtów. Znak zakończenia NULL (\0) dla każdego ciągu nie jest uwzględniony w liczbie, ale zliczane są znaki spacji (wstawione automatycznie w celu oddzielenia parametrów).

Uwaga

Miejsca osadzone w ciągach mogą powodować nieoczekiwane zachowanie; na przykład przekazanie _exec ciągu spowoduje, że nowy proces otrzyma dwa argumenty i "hi" "there"."hi there" Jeśli intencją było otwarcie nowego procesu o nazwie "hi there", proces zakończy się niepowodzeniem. Można tego uniknąć, cytując ciąg: "\"hi there\"".

Ważne

Nie przekazuj danych wejściowych użytkownika do _exec bez jawnego sprawdzania jego zawartości. _exec spowoduje wywołanie CreateProcess metody , dlatego należy pamiętać, że niekwalifikowane nazwy ścieżek mogą prowadzić do potencjalnych luk w zabezpieczeniach.

Funkcje _exec weryfikują swoje parametry. Jeśli oczekiwane parametry to wskaźniki o wartości null, puste ciągi lub pominięte, _exec funkcje wywołują nieprawidłową procedurę obsługi parametrów zgodnie z opisem w temacie Weryfikacja parametrów. Jeśli wykonanie może kontynuować, te funkcje są ustawione errno na EINVAL wartość i zwracają wartość -1. Nie jest wykonywany żaden nowy proces.

Wskaźniki argumentów można przekazać jako oddzielne parametry (w _execlsystemach , _execle, _execlpi _execlpe) lub jako tablicę wskaźników (w _execvelementach , _execve, _execvpi _execvpe). Co najmniej jeden parametr musi arg0zostać przekazany do nowego procesu. Ten parametr jest argv[0] nowym procesem. Zazwyczaj ten parametr jest kopią cmdname. (Inna wartość nie generuje błędu).

Wywołania _execl, , _execle_execlpi _execlpe są zwykle używane, gdy liczba parametrów jest znana z wyprzedzeniem. Parametr arg0 jest zwykle wskaźnikiem do cmdname. Parametry arg1 przez argn punkt do ciągów znaków tworzących nową listę parametrów. Wskaźnik o wartości null musi oznaczać argn koniec listy parametrów.

Wywołania _execv, , _execve_execvpi _execvpe są przydatne, gdy liczba parametrów nowego procesu jest zmienna. Wskaźniki do parametrów są przekazywane jako tablica . argv Parametr argv[0] jest zwykle wskaźnikiem do cmdname. Parametry argv[1] przez argv[n] punkt do ciągów znaków tworzących nową listę parametrów. Parametr argv[n+1] musi być wskaźnikiem NULL , aby oznaczyć koniec listy parametrów.

Pliki otwierane po _exec wywołaniu pozostają otwarte w nowym procesie. W _execlwywołaniach , _execlp_execvi _execvp nowy proces dziedziczy środowisko procesu wywołującego. _execle, , _execlpe_execvei _execvpe wywołuje zmianę środowiska dla nowego procesu, przekazując listę ustawień środowiska za pomocą parametru envp . envp jest tablicą wskaźników znaków, z których każdy element (z wyjątkiem końcowego elementu) wskazuje ciąg o wartości null definiujący zmienną środowiskową. Taki ciąg zwykle ma postać NAME=value , w której NAME jest nazwą zmiennej środowiskowej i value jest wartością ciągu, do której jest ustawiona ta zmienna. (Element value nie jest ujęta w znaki podwójnego cudzysłowu). Ostatnim elementem envp tablicy powinien być NULL. Gdy envp sam proces to NULL, nowy proces dziedziczy ustawienia środowiska procesu wywołującego.

Program wykonywany przy użyciu jednej _exec z funkcji jest zawsze ładowany do pamięci tak, jakby maksymalne pole alokacji w nagłówku pliku .exe programu zostało ustawione na wartość 0xFFFFHdomyślną .

Wywołania _exec nie zachowują trybów tłumaczenia otwartych plików. Jeśli nowy proces musi używać plików odziedziczonych po procesie wywołującym, użyj _setmode procedury, aby ustawić tryb tłumaczenia tych plików na żądany tryb. Musisz jawnie opróżnić (przy użyciu fflush lub _flushall) lub zamknąć dowolny strumień przed _exec wywołaniem funkcji. Ustawienia sygnału nie są zachowywane w nowych procesach tworzonych przez wywołania procedur _exec . Ustawienia sygnału są resetowane do wartości domyślnej w nowym procesie.

Przykład

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

Uruchom następujący program, aby wykonać Crt_args.exe:

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

Wymagania

Nagłówek: process.h

Zobacz też

Kontrola procesu i środowiska
abort
atexit
exit, , _Exit_exit
_onexit, _onexit_m
_spawn, _wspawn funkcje
system, _wsystem