_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
및 _execvpe
는 cmdname
환경 변수가 지정한 디렉터리에서 동일한 절차에 따라 PATH
을 검색합니다. 드라이브 지정자 또는 슬래시(상대 경로인 경우)_exec
가 포함된 경우 cmdname
호출은 지정된 파일만 검색하며 경로는 검색되지 않습니다.
매개 변수는 _exec
호출 시 문자열에 대한 한 개 이상의 포인터를 매개 변수로 제공하여 매개 변수를 새 프로세스에 전달합니다. 이러한 문자열은 새 프로세스에 대한 매개 변수 목록을 구성합니다. 상속된 환경 설정과 새 프로세스의 매개 변수 목록을 구성하는 문자열의 결합된 길이는 32KB를 초과하지 않아야 합니다. 각 문자열의 종료 NULL
문자(\0
)는 개수에 포함되지 않지만 공백 문자(매개 변수를 구분하기 위해 자동으로 삽입됨)는 계산됩니다.
참고 항목
문자열에 포함된 공백으로 인해 예기치 않은 동작이 발생할 수 있습니다. 예를 들어 _exec
를 전달하면 문자열 "hi there"
는 두 개의 인수 "hi"
및 "there"
를 가져오는 새 프로세스가 됩니다. 새 프로세스에서 "hi there"라는 파일을 열도록 의도한 것이라면 이 프로세스는 실패한 것입니다. "\"hi there\""
처럼 문자열을 따옴표로 묶으면 이러한 문제를 피할 수 있습니다.
Important
내용을 명시적으로 확인하지 않고 사용자 입력을 _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
이러한 파일의 변환 모드를 원하는 모드로 설정합니다. 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