_exec, _wexec — Funkcje
Każda funkcja ta rodziny ładuje i wykonuje nowy proces:
Litera na końcu nazwy funkcji określa zmiany.
sufiks funkcji _exec |
Opis |
---|---|
e |
envp, tablicy wskaźników ustawienia środowiska są przekazywane do nowego procesu. |
l |
Argumenty wiersza polecenia są przekazywane do pojedynczo _exec funkcji.Zazwyczaj używany, gdy liczba parametrów do nowego procesu jest znany z góry. |
p |
PATHZmienna środowiskowa jest używany do wykonania tego pliku. |
v |
argv, tablicy wskaźników argumentów wiersza polecenia są przekazywane do _exec.Zazwyczaj używany, gdy liczba parametrów do nowego procesu jest zmienna. |
Uwagi
Każdy _exec funkcji ładuje i wykonuje nowy proces.Wszystkie _exec funkcje używają tej samej funkcji systemu operacyjnego (CreateProcess)._exec Funkcje obsługi automatycznie argumenty ciąg znaków wielobajtowych zgodnie z potrzebami, rozpoznawanie sekwencje znaków wielobajtowych zgodnie z strony wielobajtowych kod aktualnie w użyciu._wexec Funkcje są wersjami całego znaku _exec funkcji._wexec Funkcje zachowują się tak samo ich _exec odpowiednikami rodziny z tą różnicą, że nie obsługują ciągi znaków wielobajtowych.
Mapowania procedur zwykłego tekstu
Procedura tchar.h |
_UNICODE i _MBCS niezdefiniowane |
_MBCS zdefiniowano |
_UNICODE zdefiniowano |
---|---|---|---|
_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 określa plik do wykonania jako nowy proces.Może określać pełną ścieżkę (od katalogu głównego), ścieżka częściowa (z bieżącego katalogu roboczego) lub nazwę pliku.Jeśli cmdname nie ma rozszerzenia nazwy pliku lub nie kończy się na kropki (.), _exec funkcji wyszukiwania dla nazwanego pliku.Jeśli wyszukiwanie nie powiedzie się, podejmie taką samą nazwę z rozszerzeniem .com, a następnie .exe, .bat i .cmd pliki z rozszerzeniem.Jeśli cmdname ma rozszerzenie nazwy pliku tylko tego rozszerzenia jest używany podczas wyszukiwania.Jeśli cmdname kończy się kropką, _exec szuka funkcji cmdname bez rozszerzenia nazwy pliku._execlp, _execlpe, _execvp, i _execvpe wyszukiwanie cmdname (przy użyciu tej samej procedury) w określonym przez PATH zmiennej środowiskowej.Jeśli cmdname zawiera specyfikator dysku lub dowolnym ukośniki (jeśli jest ścieżką względną), _exec wywołania wyszukiwania tylko dla określonego pliku. Ścieżka nie będzie przeszukiwana.
Parametry są przekazywane do nowego procesu, przekazując wskaźniki co najmniej jeden ciągi znaków w parametrach _exec wywołania.Te ciągi znaków formularza listy parametrów dla nowego procesu.Łączna długość ustawienia dziedziczone środowisko i ciągi tworzących na liście parametrów dla nowego procesu nie może przekraczać 32 kilobajtach.Kończącego znaku null (\0) dla każdego ciągu nie jest uwzględniony w obliczeniach, ale są liczone znaków spacji (automatycznie wstawione do oddzielania parametrów).
[!UWAGA]
Spacje osadzone w ciągi może spowodować nieoczekiwane zachowanie; na przykład przekazywania _exec ciąg "hi there" spowoduje nowy proces pobierania dwóch argumentów: "hi" i "there".Jeśli zamiarem ma nowy proces otwarcia pliku o nazwie "Witaj Brak", ten proces może zakończyć się niepowodzeniem.Można tego uniknąć cytując ciąg: "\"hi there\"".
Uwaga dotycząca zabezpieczeń |
---|
Nie przekazuj dane wejściowe użytkownika, aby _exec bez sprawdzania jawnie jego zawartość._execspowoduje wywołanie CreateProcess więc pamiętać, czy ścieżka niekwalifikowanej nazwy może prowadzić do potencjalnych luk w zabezpieczeniach. |
_exec Funkcje sprawdza poprawność ich parametrów.Jeśli oczekiwano, parametry są wskaźniki zerowe, puste ciągi, lub jest pominięty, _exec program obsługi nieprawidłowy parametr wywołania funkcji, zgodnie z opisem w Sprawdzanie poprawności parametru.Jeśli jest dozwolone wykonywanie aby kontynuować, ustaw tych funkcji errno do EINVAL i zwraca wartość -1.Nie nowe jest przeprowadzony proces.
Wskaźniki argumentu mogą być przekazywane jako osobne parametry (w _execl, _execle, _execlp, i _execlpe) lub w postaci tablicy wskaźników (w _execv, _execve, _execvp, i _execvpe).Co najmniej jeden parametr arg0, muszą zostać przekazane do nowego procesu; Ten parametr jest argv[0] nowego procesu.Ten parametr jest zazwyczaj, kopię cmdname.(Innej wartości nie generuje błąd).
_execl, _execle, _execlp, I _execlpe wywołania zazwyczaj są używane, gdy liczba parametrów jest znana wcześniej.Parametr arg0 jest zwykle wskaźnik do cmdname.Parametry arg1 za pośrednictwem argn wskaż ciągi znaków, tworzące nowe listy wartości parametru.Wskaźnik null należy wykonać argn do oznaczenia na końcu listy parametrów.
_execv, _execve, _execvp, I _execvpe wywołania są pomocne, gdy liczba parametrów do nowego procesu jest zmienna.Łącza do parametry są przekazywane jako tablica, argv.Parametr argv[0] jest zwykle wskaźnik do cmdname.Parametry argv[1] za pośrednictwem argv[n] wskaż ciągi znaków, tworzące nowe listy wartości parametru.Parametr argv[n+ 1] musi być NULL wskaźnik do oznaczenia na końcu listy parametrów.
Otwórz pliki, które są, gdy _exec zostanie nawiązane połączenie, pozostać otwarte w nowym procesie.W _execl, _execlp, _execv, i _execvp wywołań, nowy proces dziedziczy środowisko procesu wywołującego._execle, _execlpe, _execve, i _execvpe wywołania wpływu na środowisko nowy proces przez przekazanie listę ustawień środowiska za pomocą envp parametru.envpjest tablicy wskaźników znak, każdy element, który (z wyjątkiem ostatniego elementu) wskazuje ciąg zerem zdefiniowania zmiennej środowiskowej.Taki ciąg ma zazwyczaj postać NAME=value gdzie NAME to nazwa zmiennej środowiskowej i value jest wartość ciągu, do którego ma wartość tej zmiennej.(Należy pamiętać, że value nie jest ujęta w znaki cudzysłowu.) Ostatniego elementu z envp Tablica powinna być NULL.Gdy envp jest automatycznie NULL, nowy proces dziedziczy ustawienia środowiska procesu wywołującego.
Program wykonać jedną z _exec tak, jakby pole Maksymalna alokacja w nagłówku pliku .exe programu zostały ustawione na wartość domyślną 0xFFFFH funkcji zawsze jest ładowane do pamięci.
_exec Połączeń nie zostaną zachowane w trybach tłumaczenia otwartych plików.Nowy proces muszą mieć pliki odziedziczone proces wywołujący, użyć _setmode procedury, aby ustawić tryb tłumaczenia tych plików w trybie żądaną.Należy jawnie opróżnianie (przy użyciu fflush lub _flushall) lub zamknij wszelkie strumienia przed _exec wywołania funkcji.Sygnał ustawienia nie zostaną zachowane w nowych procesów, które są tworzone przez wywołania _exec procedury.Sygnał ustawienia zostaną przywrócone do domyślnego w nowy proces.
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 można było 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 );
}
Odpowiednik w programie .NET Framework
Nagłówek: process.h