Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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