_exec에 _wexec 함수
이 제품군에 속하는 각 함수 로드 하 고 새 프로세스에서 실행 합니다.
변형 함수 이름 끝에 문자를 결정합니다.
_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 환경 변수.경우 cmdname (즉, 상대 경로 경우) 드라이브 지정자 또는 모든 슬래시를 포함의 _exec 를 호출 합니다; 지정 된 파일에 대 한 검색 경로 검색 되지 않습니다.
매개 변수 전달에 새 프로세스가 하나 이상의 포인터를 문자열 매개 변수로 제공 하 여 해당 _exec 를 호출 합니다.이러한 문자가 문자열 매개 변수 목록에 대 한 새 프로세스를 형성합니다.상속 된 환경 설정 및 매개 변수 목록에 대 한 새 프로세스를 형성 하는 문자열 조합의 길이가 32 킬로바이트 초과 하지 않아야 합니다.각 문자열에 대 한 종료 null 문자 ('\ 0')을 개수에 포함 되지 않습니다 있지만 공백 문자 (구분 된 매개 변수를 자동으로 삽입) 계산 됩니다.
[!참고]
문자열에 포함 된 공백은 예기치 않은 동작이 발생할 수 있습니다. 예를 들어, 전달 _exec 문자열 "hi there" 두 개의 인수를 가져오는 새 프로세스에서 발생 합니다 "hi" 및 "there".라는 파일을 열고 새 프로세스를 의도 한 경우 "hi 있을", 프로세스를 실패 하 게 됩니다.문자열을 인용 하 여 피할 수 있습니다: "\"hi there\"".
보안 정보 |
---|
사용자 입력을 전달 하지 않습니다 _exec 명시적으로 해당 내용을 확인 하지 않고 있습니다._exec에 대 한 호출 됩니다 오류가 따라서 조건이 지정 되지 않은 경로 이름 인해 잠재적인 보안 문제를 고려 합니다. |
_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 새 매개 변수 목록을 형성 문자 문자열을 가리킵니다.널 포인터 이어야 합니다. argn 는 매개 변수 목록의 끝을 표시 합니다.
_execv, _execve, _execvp, 및 _execvpe 호출 됩니다 유용한 경우 새 프로세스에 대 한 매개 변수 변수 번호입니다.매개 변수에 대 한 포인터 배열을 이름으로 전달 됩니다 argv.매개 변수 argv[0]은 일반적으로에 대 한 포인터입니다 cmdname.매개 변수 argv[1]를 통해 argvn 새 매개 변수 목록을 형성 문자 문자열을 가리킵니다.매개 변수 argvn+ 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 루틴을 이러한 파일의 번역 모드 원하는 모드를 설정 합니다.명시적으로 flush 합니다 (사용 하 여 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 );
}
.NET Framework에 있는 해당
헤더: process.h