_exec, _wexec 함수_exec, _wexec Functions

이 패밀리의 다음 각 함수는 새 프로세스를 로드하고 실행합니다.Each function in this family loads and executes a new process:

_execl, _wexecl_execl, _wexecl _execv, _wexecv_execv, _wexecv
_execle, _wexecle_execle, _wexecle _execve, _wexecve_execve, _wexecve
_execlp, _wexeclp_execlp, _wexeclp _execvp, _wexecvp_execvp, _wexecvp
_execlpe, _wexeclpe_execlpe, _wexeclpe _execvpe, _wexecvpe_execvpe, _wexecvpe

함수 이름 끝에 있는 문자는 변형을 확인합니다.The letter at the end of the function name determines the variation.

_exec 함수 접미사_exec function suffix 설명Description
e 환경 설정에 대한 포인터의 배열인 envp가 새 프로세스로 전달됩니다.envp, array of pointers to environment settings, is passed to the new process.
l 명령줄 인수는 _exec 함수로 개별적으로 전달됩니다.Command-line arguments are passed individually to _exec function. 새 프로세스의 매개 변수 개수가 미리 알려진 경우 일반적으로 사용됩니다.Typically used when the number of parameters to the new process is known in advance.
p PATH 환경 변수는 실행할 파일을 찾는 데 사용됩니다.PATH environment variable is used to find the file to execute.
v 명령줄 인수에 대한 포인터의 배열인 argv_exec로 전달됩니다.argv, array of pointers to command-line arguments, is passed to _exec. 새 프로세스의 매개 변수 개수가 가변적인 경우 일반적으로 사용됩니다.Typically used when the number of parameters to the new process is variable.

주의Remarks

_exec 함수는 새 프로세스를 로드하고 실행합니다.Each _exec function loads and executes a new process. 모든 _exec 함수는 동일한 운영 체제 함수(CreateProcess)를 사용합니다.All _exec functions use the same operating-system function (CreateProcess). _exec 함수는 멀티바이트 문자열 인수를 적절하게 자동으로 처리하여 현재 사용 중인 멀티바이트 코드 페이지에 따라 멀티바이트 문자 시퀀스를 인식합니다.The _exec functions automatically handle multibyte-character string arguments as appropriate, recognizing multibyte-character sequences according to the multibyte code page currently in use. _wexec 함수는 _exec 함수의 와이드 문자 버전입니다.The _wexec functions are wide-character versions of the _exec functions. _wexec 함수는 멀티바이트 문자열을 처리하지 않는다는 점만 제외하면 자신의 _exec 패밀리 대응 함수와 동일하게 작동합니다.The _wexec functions behave identically to their _exec family counterparts except that they do not handle multibyte-character strings.

제네릭 텍스트 라우팅 매핑Generic-Text Routine Mappings

Tchar.h 루틴Tchar.h routine _UNICODE 및 _MBCS 정의되지 않음_UNICODE and _MBCS not defined _MBCS 정의됨_MBCS defined _UNICODE 정의됨_UNICODE defined
_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 매개변수는 새 프로세스로 실행할 파일을 지정합니다.The cmdname parameter specifies the file to be executed as the new process. 이 매개 변수는 루트부터 시작하는 전체 경로, 현재 작업 디렉터리부터 시작하는 부분 경로 또는 파일 이름을 지정할 수 있습니다.It can specify a full path (from the root), a partial path (from the current working directory), or a file name. cmdname 매개 변수에 확장명이 없거나 이 매개 변수가 마침표(.)로 끝나지 않은 경우에도 _exec 함수는 명명된 파일을 검색합니다.If cmdname does not have a file name extension or does not end with a period (.), the _exec function searches for the named file. 검색에 실패하면 이 매개 변수는 기본 이름은 동일하고 확장명이 .com인 파일을 검색한 다음, 확장명이 .exe, .bat 및 .cmd인 파일을 차례대로 검색합니다.If the search is unsuccessful, it tries the same base name with the .com file name extension and then with the .exe, .bat, and .cmd file name extensions. cmdname에 파일 확장명이 포함되어 있으면 검색에서는 해당 확장명만 사용됩니다.If cmdname has a file name extension, only that extension is used in the search. cmdname이 마침표로 끝나는 경우 _exec 함수는 파일 확장명이 없는 cmdname을 검색합니다.If cmdname ends with a period, the _exec function searches for cmdname with no file name extension. _execlp, _execlpe, _execvp_execvpecmdname 환경 변수가 지정한 디렉터리에서 동일한 절차에 따라 PATH을 검색합니다._execlp, _execlpe, _execvp, and _execvpe search for cmdname (using the same procedures) in the directories specified by the PATH environment variable. cmdname에 드라이브 지정자 또는 슬래시(즉, 상대 경로인 경우)가 포함된 경우 _exec 호출은 지정된 파일만 검색하고 경로는 검색하지 않습니다.If cmdname contains a drive specifier or any slashes (that is, if it is a relative path), the _exec call searches only for the specified file; the path is not searched.

매개 변수는 _exec 호출 시 문자열에 대한 한 개 이상의 포인터를 매개 변수로 제공하여 매개 변수를 새 프로세스에 전달합니다.Parameters are passed to the new process by giving one or more pointers to character strings as parameters in the _exec call. 이러한 문자열은 새 프로세스에 대한 매개 변수 목록을 구성합니다.These character strings form the parameter list for the new process. 상속된 환경 설정과 새 프로세스의 매개 변수 목록을 구성하는 문자열의 결합된 길이는 32KB를 초과하지 않아야 합니다.The combined length of the inherited environment settings and the strings forming the parameter list for the new process must not exceed 32 kilobytes. 각 문자열의 null 종결 문자('\0')는 계산되지 않지만 매개 변수를 구분하기 위해 자동으로 삽입된 공백 문자는 계산됩니다.The terminating null character ('\0') for each string is not included in the count, but space characters (inserted automatically to separate the parameters) are counted.

참고

문자열에 포함된 공백으로 인해 예기치 않은 동작이 발생할 수 있습니다. 예를 들어 _exec를 전달하면 문자열 "hi there"는 두 개의 인수 "hi""there"를 가져오는 새 프로세스가 됩니다.Spaces embedded in strings may cause unexpected behavior; for example, passing _exec the string "hi there" will result in the new process getting two arguments, "hi" and "there". 새 프로세스에서 "hi there"라는 파일을 열도록 의도한 것이라면 이 프로세스는 실패한 것입니다.If the intent was to have the new process open a file named "hi there", the process would fail. "\"hi there\""처럼 문자열을 따옴표로 묶으면 이러한 문제를 피할 수 있습니다.You can avoid this by quoting the string: "\"hi there\"".

중요

내용을 명시적으로 확인하지 않고 사용자 입력을 _exec에 전달하지 마세요.Do not pass user input to _exec without explicitly checking its content. _execCreateProcess를 호출합니다. 따라서 정규화되지 않은 경로 이름을 사용하는 경우 보안 취약성이 발생할 수 있음을 기억해야 합니다._exec will result in a call to CreateProcess so keep in mind that unqualified path names could lead to potential security vulnerabilities.

_exec 함수는 자신의 매개 변수에 대한 유효성을 검사합니다.The _exec functions validate their parameters. 예상 매개 변수가 null 포인터이거나 빈 문자열이거나 생략된 경우 _exec 함수는 매개 변수 유효성 검사에 설명된 대로 잘못된 매개 변수 처리기를 호출합니다.If expected parameters are null pointers, empty strings, or omitted, the _exec functions invoke the invalid parameter handler as described in Parameter Validation. 계속해서 실행하도록 허용한 경우 이러한 함수는 errnoEINVAL 로 설정하고 -1을 반환합니다.If execution is allowed to continue, these functions set errno to EINVAL and return -1. 새로운 프로세스가 실행되지 않습니다.No new process is executed.

인수 포인터는 개별 매개 변수(_execl, _execle, _execlp_execlpe) 또는 포인터의 배열(_execv, _execve, _execvp_execvpe)로 전달될 수 있습니다.The argument pointers can be passed as separate parameters (in _execl, _execle, _execlp, and _execlpe) or as an array of pointers (in _execv, _execve, _execvp, and _execvpe). 하나 이상의 arg0 매개 변수를 새 프로세스로 전달해야 합니다. 이 매개 변수는 새 프로세스의 argv[0]입니다.At least one parameter, arg0, must be passed to the new process; this parameter is argv[0] of the new process. 일반적으로 이 매개 변수는 cmdname의 복사본입니다.Usually, this parameter is a copy of cmdname. 다른 값은 오류를 일으키지 않습니다.(A different value does not produce an error.)

_execl, _execle, _execlp_execlpe 호출은 일반적으로 매개 변수의 개수가 미리 알려진 경우 사용됩니다.The _execl, _execle, _execlp, and _execlpe calls are typically used when the number of parameters is known in advance. 일반적으로 매개 변수 arg0cmdname에 대한 포인터입니다.The parameter arg0 is usually a pointer to cmdname. 매개 변수 arg1~argn은 새 매개 변수 목록을 구성하는 문자열을 가리킵니다.The parameters arg1 through argn point to the character strings forming the new parameter list. null 포인터는 argn에 따라 매개변수 목록의 끝을 표시합니다.A null pointer must follow argn to mark the end of the parameter list.

_execv, _execve, _execvp_execvpe 호출은 새 프로세스에 대한 매개 변수 개수가 가변적인 경우 유용합니다.The _execv, _execve, _execvp, and _execvpe calls are useful when the number of parameters to the new process is variable. 매개변수에 대한 포인터는 배열 argv로 전달됩니다.Pointers to the parameters are passed as an array, argv. 일반적으로 매개 변수 argv[0]은 cmdname에 대한 포인터입니다.The parameter argv[0] is usually a pointer to cmdname. 매개 변수 argv[1]~argv[n]는 새 매개 변수 목록을 구성하는 문자열을 가리킵니다.The parameters argv[1] through argv[n] point to the character strings forming the new parameter list. 매개 변수 argv[n +1]는 매개 변수 목록의 끝을 표시하는 NULL 포인터여야 합니다.The parameter argv[n+1] must be a NULL pointer to mark the end of the parameter list.

_exec 호출 시 열린 파일은 새 프로세스에서도 열린 채 남아 있습니다.Files that are open when an _exec call is made remain open in the new process. _execl, _execlp, _execv_execvp 호출 시 새 프로세스는 호출 프로세스의 환경을 상속합니다.In _execl, _execlp, _execv, and _execvp calls, the new process inherits the environment of the calling process. _execle, _execlpe, _execve_execvpe 호출은 envp 매개 변수를 통해 환경 설정 목록을 전달함으로써 새 프로세스의 환경을 변경합니다._execle, _execlpe, _execve, and _execvpe calls alter the environment for the new process by passing a list of environment settings through the envp parameter. envp는 문자 포인터의 배열로, 마지막 요소를 제외한 각 요소는 환경 변수를 정의하는 null로 끝나는 문자열을 가리킵니다.envp is an array of character pointers, each element of which (except for the final element) points to a null-terminated string defining an environment variable. 이러한 문자열의 형식은 일반적으로 NAME=value입니다. 여기서 NAME은 환경 변수의 이름이고, value는 해당 변수가 설정된 문자열 값입니다.Such a string usually has the form NAME=value where NAME is the name of an environment variable and value is the string value to which that variable is set. value는 큰따옴표로 묶지 않습니다. envp 배열의 마지막 요소는 NULL이어야 합니다.(Note that value is not enclosed in double quotation marks.) The final element of the envp array should be NULL. envp 자체가 NULL이면 새 프로세스는 호출 프로세스의 환경을 상속합니다.When envp itself is NULL, the new process inherits the environment settings of the calling process.

_exec 함수 중 하나를 사용하여 실행된 프로그램은 마치 프로그램의 .exe 파일 헤더에 있는 최대 할당 필드가 기본값인 0xFFFFH로 설정된 것처럼 항상 메모리로 로드됩니다 .A program executed with one of the _exec functions is always loaded into memory as if the maximum allocation field in the program's .exe file header were set to the default value of 0xFFFFH.

_exec 호출은 열린 파일의 변환 모드를 유지하지 않습니다.The _exec calls do not preserve the translation modes of open files. 새 프로세스가 호출 프로세스에서 상속된 파일을 사용해야 하는 경우 _setmode 루틴을 사용하여 이러한 파일의 변환 모드를 원하는 모드로 설정합니다.If the new process must use files inherited from the calling process, use the _setmode routine to set the translation mode of these files to the desired mode. fflush 함수 호출 전에 모든 스트림을 명시적으로 플러시하거나(_flushall 또는 _exec 사용) 닫아야 합니다.You must explicitly flush (using fflush or _flushall) or close any stream before the _exec function call. _exec 루틴에 대한 호출로 생성된 새 프로세스에서 신호 설정은 유지되지 않습니다.Signal settings are not preserved in new processes that are created by calls to _exec routines. 신호 설정은 새 프로세스에서 기본값으로 다시 설정됩니다.The signal settings are reset to the default in the new process.

예제Example

// 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를 실행합니다.Run the following program to execute 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 );  
}  

요구 사항Requirements

헤더: process.hHeader: process.h

참고 항목See Also

프로세스 및 환경 제어 Process and Environment Control
abort abort
atexit atexit
exit, _Exit, _exit exit, _Exit, _exit
_onexit, _onexit_m _onexit, _onexit_m
_spawn, _wspawn 함수 _spawn, _wspawn Functions
system, _wsystemsystem, _wsystem