_exec, _wexec Functions

이 패밀리의 다음 각 함수는 새 프로세스를 로드하고 실행합니다.

함수 이름 끝에 있는 문자는 변형을 확인합니다.

_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 매개변수는 새 프로세스로 실행할 파일을 지정합니다. 이 매개 변수는 루트부터 시작하는 전체 경로, 현재 작업 디렉터리부터 시작하는 부분 경로 또는 파일 이름을 지정할 수 있습니다. 파일 이름 확장명이 없거나 마침표(.)로 끝나지 않는 경우 cmdname 함수는 _exec 명명된 파일을 검색합니다. 검색에 실패하면 이 매개 변수는 기본 이름은 동일하고 확장명이 .com인 파일을 검색한 다음, 확장명이 .exe, .bat 및 .cmd인 파일을 차례대로 검색합니다. cmdname에 파일 확장명이 포함되어 있으면 검색에서는 해당 확장명만 사용됩니다. cmdname이 마침표로 끝나는 경우 _exec 함수는 파일 확장명이 없는 cmdname을 검색합니다. _execlp, _execlpe, _execvp_execvpecmdname 환경 변수가 지정한 디렉터리에서 동일한 절차에 따라 PATH을 검색합니다. 드라이브 지정자 또는 슬래시(상대 경로인 경우)_exec가 포함된 경우 cmdname 호출은 지정된 파일만 검색하며 경로는 검색되지 않습니다.

매개 변수는 _exec 호출 시 문자열에 대한 한 개 이상의 포인터를 매개 변수로 제공하여 매개 변수를 새 프로세스에 전달합니다. 이러한 문자열은 새 프로세스에 대한 매개 변수 목록을 구성합니다. 상속된 환경 설정과 새 프로세스의 매개 변수 목록을 구성하는 문자열의 결합된 길이는 32KB를 초과하지 않아야 합니다. 각 문자열의 종료 NULL 문자(\0)는 개수에 포함되지 않지만 공백 문자(매개 변수를 구분하기 위해 자동으로 삽입됨)는 계산됩니다.

참고 항목

문자열에 포함된 공백으로 인해 예기치 않은 동작이 발생할 수 있습니다. 예를 들어 _exec를 전달하면 문자열 "hi there"는 두 개의 인수 "hi""there"를 가져오는 새 프로세스가 됩니다. 새 프로세스에서 "hi there"라는 파일을 열도록 의도한 것이라면 이 프로세스는 실패한 것입니다. "\"hi there\""처럼 문자열을 따옴표로 묶으면 이러한 문제를 피할 수 있습니다.

Important

내용을 명시적으로 확인하지 않고 사용자 입력을 _exec에 전달하지 마세요. _exec 를 호출하면 CreateProcess 정규화되지 않은 경로 이름이 잠재적인 보안 취약성을 초래할 수 있음을 명심해야 합니다.

_exec 함수는 자신의 매개 변수에 대한 유효성을 검사합니다. 필요한 매개 변수가 null 포인터, 빈 문자열 또는 생략된 경우 함수는 매개 변수 유효성 검사에 설명된 _exec 대로 잘못된 매개 변수 처리기를 호출합니다. 계속해서 실행하도록 허용한 경우 이러한 함수는 errnoEINVAL 로 설정하고 -1을 반환합니다. 새로운 프로세스가 실행되지 않습니다.

인수 포인터는 개별 매개 변수(_execl, _execle, _execlp_execlpe) 또는 포인터의 배열(_execv, _execve, _execvp_execvpe)로 전달될 수 있습니다. 매개 변수 arg0를 하나 이상 새 프로세스에 전달해야 합니다. 이 매개 변수는 새 프로세스입니다 argv[0] . 일반적으로 이 매개 변수는 cmdname의 복사본입니다. (다른 값은 오류를 생성하지 않습니다.)

_execl, _execle, _execlp_execlpe 호출은 일반적으로 매개 변수의 개수가 미리 알려진 경우 사용됩니다. 일반적으로 매개 변수 arg0cmdname에 대한 포인터입니다. 매개 변수 arg1~argn은 새 매개 변수 목록을 구성하는 문자열을 가리킵니다. null 포인터는 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