_exec
, _wexec
Функции
Каждая функция в этом семействе загружает и выполняет новый процесс.
Буква в конце имени функции определяет вариацию.
_exec суффикс функции |
Description |
---|---|
e |
envp , массив указателей на параметры среды, передается в новый процесс. |
l |
Аргументы командной строки передаются по отдельности в функцию _exec . Обычно используется, когда число параметров нового процесса известно заранее. |
p |
Переменная среды PATH используется для поиска файла для выполнения. |
v |
argv , массив указателей на аргументы командной строки, передается в _exec . Обычно используется, когда число параметров нового процесса непостоянно. |
Замечания
Каждая функция _exec
загружает и выполняет новый процесс. Все _exec
функции используют одну и ту же функцию операционной системы (CreateProcess
). Функции _exec
автоматически обрабатывают аргументы строки многобайтовых символов соответствующим образом, распознавая последовательности многобайтовых символов согласно многобайтовой кодовой странице, используемой в данный момент. Функции _wexec
— это версии функций _exec
с расширенными символами. Функции _wexec
ведут себя одинаково со своими _exec
семейными коллегами, за исключением того, что они не обрабатывают многобайтовые строки.
Сопоставления подпрограмм универсального текста
Tchar.h рутина |
_UNICODE и _MBCS не определен |
_MBCS Определенные |
_UNICODE Определенные |
---|---|---|---|
_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
указывает файл, который будет выполняться как новый процесс. Он может указывать полный путь (от корневого каталога), частичный путь (от текущего рабочего каталога) или имя файла. Если cmdname
расширение имени файла отсутствует или не заканчивается точкой (.), _exec
функция выполняет поиск именованного файла. Если поиск не дает результатов, функция пытается найти то же основное имя с расширением COM, а затем с расширениями EXE, BAT и CMD. Если параметр cmdname
включает расширение файла, для поиска используется только это расширение. Если cmdname
заканчивается точкой, функция _exec
выполняет поиск cmdname
без расширения файла. _execlp
, _execlpe
, _execvp
и _execvpe
выполняют поиск cmdname
(используя те же процедуры) в каталогах, указанных переменной среды PATH
. Если cmdname
содержит описатель диска или косую черту (то есть, если это относительный путь), _exec
вызов выполняет поиск только указанного файла; путь не выполняется.
Параметры передаются в новый процесс путем предоставления одного или нескольких указателей на строки символов как параметров в вызове _exec
. Эти строки символов формируют список параметров для нового процесса. Общая длина наследуемых параметров среды и строк, формирующих список параметров для нового процесса, не должна превышать 32 КБ. Завершающий NULL
символ (\0
) для каждой строки не включается в число, но учитываются пробелы (вставлены автоматически для разделения параметров).
Примечание.
Пробелы, встроенные в строки, могут вызывать непредвиденное поведение. Например, если передать в функцию _exec
строку "hi there"
, это приведет к тому, что новый процесс получит два аргумента: "hi"
и "there"
. Если предполагалось, что новый процесс должен открыть файл с именем hi there, произойдет сбой процесса. Этого можно избежать, заключив строку в кавычки: "\"hi there\""
.
Внимание
Не передавайте данные, вводимые пользователем, в функцию _exec
, не выбрав это содержимое явно. _exec
приведет к вызову CreateProcess
, чтобы помнить, что неквалифицированные имена путей могут привести к потенциальным уязвимостям системы безопасности.
Эти функции _exec
проверяют свои параметры. Если ожидаемые параметры являются указателями NULL, пустыми строками или опущены, функции вызывают обработчик недопустимых параметров, _exec
как описано в разделе проверки параметров. Если продолжение выполнения разрешено, эти функции устанавливают для errno
значение EINVAL
и возвращают -1. Новые процессы не выполняются.
Указатели аргументов могут передаваться как отдельные параметры (в _execl
, _execle
, _execlp
и _execlpe
) или как массивы указателей (в _execv
, _execve
, _execvp
и _execvpe
). По крайней мере один параметр arg0
должен передаваться в новый процесс. Этот параметр относится argv[0]
к новому процессу. Обычно этот параметр является копией cmdname
(Другое значение не создает ошибку.)
Вызовы функций _execl
, _execle
, _execlp
и _execlpe
обычно используются, когда число параметров известно заранее. Параметр arg0
, как правило, является указателем на cmdname
. Параметры с arg1
по argn
указывают на строку символов, формирующую новый список параметров. За параметром argn
должен следовать пустой указатель, отмечающий конец списка параметров.
Функции _execv
, _execve
, _execvp
и _execvpe
можно вызывать, когда число параметров в новом процессе не определено. Указатели на параметры передаются как массив, argv
. Параметр argv[0]
, как правило, является указателем на cmdname
. Параметры с argv[1]
по argv[n]
указывают на строку символов, формирующую новый список параметров. Параметр argv[n+1]
должен быть указателем NULL
, чтобы пометить конец списка параметров.
Файлы, открытые во время вызова функции _exec
, остаются открытыми в новом процессе. В вызовах _execl
, _execlp
, _execv
и _execvp
новый процесс наследует среду вызывающего процесса. Вызовы функций _execle
, _execlpe
, _execve
и _execvpe
изменяют среду для нового процесса, передавая список параметров среды с помощью параметра envp
. envp
— это массив указателей символов, каждый элемент которого (за исключением последнего) указывает на строку, завершающуюся символом null, определенную в переменной среды. Такие строки обычно имеют вид NAME=value
, где NAME
— это имя переменной среды, а value
— строковое значение, задаваемое для данной переменной. (Значение value
не заключено в двойные кавычки.) Конечный элемент массива envp
должен быть NULL
. Если же значение самого параметра envp
— NULL
, новый процесс наследует параметры среды вызывающего процесса.
Программа, выполняемая с одной из _exec
функций, всегда загружается в память, как если бы максимальное поле выделения в заголовке файла программы .exe было задано значение 0xFFFFH
по умолчанию.
Вызовы _exec
не сохраняют режимы перевода открытых файлов. Если новый процесс должен использовать файлы, унаследованные от вызывающего процесса, используйте _setmode
подпрограмму для задания режима перевода этих файлов в нужный режим. Перед вызовом функции fflush
необходимо явно сбросить (используя ключевое слово _flushall
или _exec
) или закрыть все потоки. Параметры сигнала не сохраняются в новых процессах, созданных вызовами _exec
подпрограмм. Сигнальные параметры сбрасываются до значений по умолчанию в новом процессе.
Пример
// 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;
}
Запустите следующую программу, чтобы выполнить 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 );
}
Требования
Заголовок: process.h
См. также
Управление процессами и средой
abort
atexit
exit
, , _Exit
_exit
_onexit
, _onexit_m
_spawn
, _wspawn
функции
system
, _wsystem