_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
_execlpe
i _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 _execl
systemach , _execle
, _execlp
i _execlpe
) lub jako tablicę wskaźników (w _execv
elementach , _execve
, _execvp
i _execvpe
). Co najmniej jeden parametr musi arg0
zostać 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
_execlp
i _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
_execvp
i _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 _execl
wywołaniach , _execlp
_execv
i _execvp
nowy proces dziedziczy środowisko procesu wywołującego. _execle
, , _execlpe
_execve
i _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ść 0xFFFFH
domyś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