다음을 통해 공유


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

매개 변수는 _exec 호출 시 문자열에 대한 한 개 이상의 포인터를 매개 변수로 제공하여 매개 변수를 새 프로세스에 전달합니다. 이러한 문자열은 새 프로세스에 대한 매개 변수 목록을 구성합니다. 상속된 환경 설정과 새 프로세스의 매개 변수 목록을 구성하는 문자열의 결합된 길이는 32KB를 초과하지 않아야 합니다. 각 문자열의 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은 새 매개 변수 목록을 구성하는 문자열을 가리킵니다. 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 루틴을 사용하여 이러한 파일의 변환 모드를 원하는 모드로 설정합니다. _exec 함수 호출 전에 모든 스트림을 명시적으로 플러시하거나(fflush 또는 _flushall 사용) 닫아야 합니다. _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