Поделиться через


_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. Если же значение самого параметра envpNULL, новый процесс наследует параметры среды вызывающего процесса.

Программа, выполняемая с одной из _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