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


_exec, функции _wexec

Каждая функция в этом семействе загружает и выполняет новый процесс:

_execl, _wexecl

_execv, _wexecv

_execle, _wexecle

_execve, _wexecve

_execlp, _wexeclp

_execvp, _wexecvp

_execlpe, _wexeclpe

_execvpe, _wexecvpe

Буква в конце имени функции, определяющий изменение.

Суффикс функции _exec

Описание

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 параметр указывает файл, который должен быть выполнен в качестве нового процесса.Он может указать полный путь (от корневого), частично путь (от текущей рабочей папки) или имя файла.If cmdname не имеет расширение имени файла не будет завершен или с точкой (.), _exec поиск функции для именованного файла.Если поиск неудачн, он пытается одинаковое базовое имя с расширением имени файла .com, а затем с помощью расширений имени файла exe, bat и cmd.If cmdname имеет расширение имени файла, но это расширение используется при поиске.If cmdname с точкой _exec поиск функций cmdname без расширения имени файла._execlp" _execlpe" _execvpи _execvpe поиск cmdname (используя те же процедуры) в каталогах, указанных PATH переменная среды.If cmdname содержит описатель диска или все знаки косой черты (т е если это относительный путь) _exec вызов выполняет поиск только для указанного файла; путь не производится поиск.

Параметры передаются в новый процесс с передачей одного или нескольких указателей в строках символов в качестве параметров _exec вызов.Эти символьные строки формируют список параметров для нового процесса.Совмещенная длина унаследованных параметров среды и строк, формируя список параметров для нового процесса не должна превышать 32 килобайта.Конечный нуль-символ (" \ 0 ") для каждой строки не включен в количестве, но пробелы (вставленные автоматически для разделения параметров) учитываются.

ПримечаниеПримечание

Внедренные пробелы в строках могут вызвать непредвиденную расширения функциональности; например, передавая _exec string "hi there" завершится в новом процессе получения аргумента, 2 "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 via argn укажите строки символов формируя новый список параметров.Указатель null должен соответствовать argn чтобы отметить конец списка параметров.

_execv" _execve" _execvpи _execvpe вызовы полезны, когда число параметров в новый процесс переменно.Указатели на параметры передаются в виде массива argv.Параметр argv[0] обычно указатель на cmdname.Параметры argv[1] до конца argv[n] укажите строки символов формируя новый список параметров.Параметр argv[n+1] должны быть a NULL указатель, чтобы отметить конец списка параметров.

Файлы, открытые при _exec вызывается остается открытым в новом процессе.IN _execl" _execlp" _execvи _execvp вызовы новый процесс наследуют среду вызывающего процесса._execle" _execlpe" _execveи _execvpe вызовы изменяют среду для нового процесса путем передачи списка параметров среды через envp параметр.envp массив указателей, каждый элемент которого (за исключением последнего элемента) указывает на null-завершенной строке, указав переменную среды.Такая строка обычно имеет форму NAME=value где NAME имя переменной среды и value строковое значение, в котором эта переменная задана.(Обратите внимание, что value не заключен в двойные кавычки ("). Конечный элемент envp массив должен иметь NULL.После envp сам NULLновый процесс наследует параметры среды вызывающего процесса.

Программа выполнена с одним из _exec функции всегда загружаются в память, если поле выделения в заголовке exe- max программы был установлен равным значению по умолчанию 0xFFFFH.

_exec вызовы не сохраняют режимы перевода открытых файлов.Если новый процесс должен использовать файлы, унаследованные от вызывающего процесса, используйте _setmode подпрограмма, чтобы установить режим перевода этих файлов на требуемый режим.Необходимо явно сбросить (using fflush OR _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 );
}

Количество платформы .NET Framework

заголовок: process.h

См. также

Ссылки

Процесс и управление среды

abort

atexit

exit, _exit

_onexit, _onexit_m

_spawn, функции _wspawn

system, _wsystem