EXEC(3)

이름
execl, execlp, execle, execv, execvp - 파일 실행하기

사용법
#include <unistd.h>

extern char **environ;

int execl( const char *path, const char *arg, ...);
int execlp( const char *file, const char *arg, ...);
int execle( const char *path, const char *arg , ..., char * const envp[]);
int execv( const char *path, char *const argv[]);
int execvp( const char *file, char *const argv[]);

설명
exec 함수 계열은 현재 프로세스 이미지를 새로운 프로세스 이미지로 바꾼다. 이 매뉴얼에 기술된 함수들은 execve(2) 함수의 전위들이다. (현재 프로세스의 대체에 관한 세부적인 정보를 원하면 execve 매뉴얼 페이지를 참고해라.)

이들 함수의 초기 인자는 실행되어야 하는 파일의 경로명이다.

const char *arg 와 execl, execlp, 그리고 execle 함수들에 있는 연속적인 것들은 arg0, arg1, ..., argn 등으로 생각할 수 있다. 그것들은 실행 프로그램이 이용할 수 있는 인자 리스트를 나타내는 하나나 그이상의 null로 끝난 문자열을 가리킨다. 편의를 위해, 처음 인자는 실행되어야 할 파일의 이름이다. 인자 리스트는 반드시 NULL 포인터로 끝나야 한다.

execv 와 execvp 함수는 새로운 프로그램이 이용할수 있는 인자 리스트를 나타내는 null로 끝난 문자열의 포인터 배열을 제공한다. 편리를 위해, 첫 인자는 실행되어야 할 파일과 관련된 파일 이름 을 가리켜야 한다. 포인터 배열은 반드시 NULL 포인터로 끝나야 한다.

execle 함수는 또한 실행 프로세서의 환경변수를 지정해야 하며, 파라미터 리스트에 있는 인자 리스트나 추가적인 파라미터를 가지고 있는 argv 배열에 대한 포인터를 끝마치도록 NULL 포인터가 뒤따라 온다. 이러한 추가적인 파라미터는 null로 끝난 문자열에 대한 포인터 배열이며 반드시 NULL 로 끝나야 한다. 다른 함수들은 현재 프로세스에 있는 외부 변수 environ 에서 새로운 프로세스 이미지를 위한 환경 변수를 가져온다.

이들 함수들 중 몇몇은 특별한 의미를 가지고 있다.

만일 지정된 파일 이름이 slash(/) 문자를 포함하지 않는다면 execlp 와 execvp 함수는 실행파일을 찾기 위해 shell 의 행동을 복사한다. 탐색 경로는 PATH 변수에 지정된 경로이다. 이 변수가 지정되지 않는다면, 기본 경로 ``:/bin:/usr/bin''가 사용된다. 추가적으로, 어떤 에러들은 특별하게 처리된다.

만일 허가권이 파일에 금지되어 있다면 ( execve 는 EACCES를 반환한다.), 이들 함수들은 탐색 경로의 나머지를 계속해서 탐색한다. 그러나 만일 어떤 다른 파일이 발견된다면, 전역 변수 errno 를 EACCES로 설정하고 반환된다.

만일 파일의 헤더가 인식되지 않는다면( execve 는 ENOEXEC를 반환한다), 이들 함수들은 첫 인자로써 파일의 경로에 있는 shell을 실행한다. (만일 이들 시도가 실패한다면, 추가적인 탐색은 행해지지 않는다.)

반환값
만일 exec 함수들이 반환한다면, 에러가 일어난 것이다. 반환 값은 -1이며, 전역 변수 errno 는 에러를 가리키도록 설정된다.

파일
/bin/sh

에러
이들 함수 모두는 실패할수 있으며 라이브러리 함수 execve(2)에 지정된 에러중 어떤 것으로 errno 가 설정된다.

관련 항목
sh(1), execve(2), fork(2), environ(5), ptrace(2)

호환
몇몇 다른 시스템에서 기본 PATH는 anti-Trojan-horse 처럼 /bin 그리고 /usr/bin후에 나열된 현재 작업 디렉토리를 가진다. libc 5.4.7에서, 리눅스는 여전히 현재 작업 디렉토리를 기본 PATH로 사용한다.

파일을 실행하는 동안 에러가 나타났을 때 execlp 그리고 execvp 의 행동은 역사적 관습에 따른다. 그러나 전통적으로 문서화되지 않으며 POSIX 표준에도 지정되지 않는다. BSD(그리고 다른 시스템)는 자동적으로 sleep을 하며 만일 ETXTBSY를 만난다면 다시 시도한다. Linux는 어려운 에러로 대하고 바로 반환한다.

전통적으로, 함수 execlp 와 execvp 는 위에 기술된 것들 그리고 ENOMEM 그리고 E2BIG를 제외한 모든 에러를 무시하며 리턴된다. 이들 함수는 위에 기술된 것들 이외의 에러를 만난다면 바로 리턴된다.

표준
Execl, execv, execle, execlp 그리고 execvp 는 IEEE Std1003.1-88 (``POSIX.1'')를 따른다.

번역
정강훈 <skyeyes@soback.kornet.net> 2001년 3월 8일
한글 Manpage 프로젝트 (http://man.kldp.org) 2005년 2월 17일