EXEC(3)

명칭
execl, execlp, execle, exect, execv, execvp - 파일을 실행한다

프로그램 라이브러리
libc

서식
<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, ...) int exect(const char *path, char *const argv[], char *const envp[]) int execv(const char *path, char *const argv[]) int execvp(const char *file, char *const argv[])

해설
exec() 패밀리의 함수는 현재의 프로세스 이미지를 새로운 프로세스 이미지로 두어 바꿉니다. 이 메뉴얼 페이지로 설명하는 함수는, 함수 execve(2) 의 프론트엔드입니다 (현재의 프로세스의 치환의 상세한 것에 대하여는, execve(2) 의 메뉴얼 페이지를 참조해 주세요).

이러한 함수의 초기 인수는, 실행되는 파일의 패스명입니다.

execl(), execlp(), 및 execle() 의 각 함수의 const char *arg 및 후속의 생략 기호는 arg0, arg1, ..., argn (이)라고 생각할 수가 있습니다. 이것들은 실행되었다 프로그램에 이용할 수 있는 인수 리스트를 나타내는 널 캐릭터로 끝나는 string를 가리킨다 1 개(살) 또는 복수의 포인터의 리스트를 기술합니다. 관행으로, 최초의 인수는, 실행중의 파일에 대응하는 파일명을 가리킬 필요가 있습니다. 인수의 리스트는 NULL 포인터로 종료시킨다 필요가 있어

exect(), execv(), 및 execvp() 의 각 함수는, 새로운 프로그램에 이용할 수 있는 인수 리스트를 나타낸다 널 캐릭터로 끝나는 string를 가리키는 포인터의 배열을 제공합니다. 관행으로, 최초의 인수는, 실행중의 파일에 대응하는 파일명을 가리킬 필요가 있습니다. 포인터의 배열은 NULL 포인터로 종료한다 필요가 있어

execle() (와)과 exect() 의 각 함수도, 실행된 프로세스의 환경을 지정합니다. 그러기 위해서는, 파라미터 리스트내에 있는 인수 리스트를 종료시킨다 NULL 포인터, 또는 추가 파라미터와 함께 argv 배열을 가리키는 포인터에 따릅니다. 이 추가의 파라미터는, 널 캐릭터로 끝나는 string를 가리키는 포인터의 배열이며, NULL 포인터로 종료된다 필요가 있어 다른 함수는, 현재의 프로세스내의 외부 변수 environ (으)로부터 새로운 프로세스 이미지용의 환경을 다룹니다.

이러한 함수에는 특별한 의미론이 있는 것도 있습니다.

execlp() (와)과 execvp() 의 각 함수는, 지정된 파일명에 slash “/” 하지만 포함되지 않은 경우, 실행 가능 파일을 검색해 쉘의 처치를 복제합니다. 검색 패스는 “PATH” 변수에 의해 환경내에서 지정된 패스입니다. 이 값이 지정되지 않는 경우, <paths.h> 의 _PATH_DEFPATH 정의에 따라, 디폴트의 패스가 설정됩니다. 이것은, “/bin:/usr/bin:” (으)로 설정되어 있습니다. 게다가 특정의 에러가 특별히 취급됩니다.

에러가 애매한 경우(간단하게 하기 위해서, 여기에서는 ENOEXEC 이외의 모든 에러를 애매라고 생각합니다. 다만, 치명적인 에러 EACCES 만이 실로 애매합니다), 이러한 함수는, 파일을 개시해, 파일이 존재하는지, 그리고 적절한 실행 퍼미션이 있는지를 판정하는것 같이 동작합니다. 그런 경우, 이러한 함수는 execve() 에 의해 설정된 값에 복원된 글로벌 변수 errno 그리고 즉시 돌아옵니다. 그렇지 않은 경우, 검색이 계속합니다. 검색이 execve() 의 실행에 성공하지 않고, 또는 에러를 위해서(때문에) 종료하지 않고 완료하면(자), 이러한 함수는, 적절한 실행 퍼미션이 있는 적어도 1 개의 파일이 발견되었는지 어떠했는지에 따라, 글로벌 변수 errno (을)를 EACCES 또는 ENOENT (으)로 설정해 돌아옵니다.

파일의 헤더가 인식되지 않는다(시도했다 execve() 하지만 ENOEXEC (을)를 돌려줄) 경우, 이러한 함수는, 최초의 인수로서 파일의 패스가 있는 쉘을 실행합니다 (이 시도가 실패했을 경우, 그 이상의 검색은 행해지지 않습니다).

exect() 함수는, 프로그램 트레이스 기능을 유효하게 해 파일을 실행합니다 ( ptrace(2) (을)를 참조).

반환값
exec() 함수가 돌아왔을 경우, 에러가 발생하고 있을 것입니다. 반환값은 -1 이어, 글로벌 변수 errno 하지만 설정되어 에러를 나타냅니다.

파일
/bin/sh 쉘

에러
execl(), execle(), execlp() 및 execvp() (은)는 처리 실패해, 프로그램 라이브러리 함수 execve(2) 및 malloc(3) 에 붙어 지정된 에러를 지정한다 errno (을)를 설정할 가능성이 있습니다.

exect() (와)과 execv() (은)는, 프로그램 라이브러리 함수 execve(2) 에 붙어 지정된 에러에 관계해 errno (을)를 설정할 가능성이 있습니다.

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

호환성
역사적으로는 execlp() 함수와 execvp() 함수의 디폴트의 패스는 “:/bin:/usr/bin” 입니다. 이것이, system security를 향상시키기 위해서(때문에) 현재의 디렉토리를 마지막으로 배치하도록(듯이) 변경되었습니다.

파일을 실행하려고 하고 있는 동안에 에러가 발생했을 때의 execlp() (와)과 execvp() 의 동작은, 그다지 역사적인 관행이 아니고, 종래부터 문서화 되지 않고, POSIX 표준으로 지정되어 있지 않습니다.

종래, execlp() 함수와 execvp() 함수는, 상기의 것, 및 ETXTBSY, ENOMEM (와)과 E2BIG (을)를 제외해 모든 에러를 무시했습니다. ETXTBSY 그리고 이러한 함수는 몇초간, sleeve 한 다음에 재시행해, ENOMEM (와)과 E2BIG 그리고 이러한 함수는 돌아갑니다. 이것들은 현재 ETXTBSY 에 붙어 돌아와, 존재와 실행 가능성을 좀 더 주의 깊게 판정합니다. 특히, 패스 접두어내의 액세스 할 수 없는 디렉토리를 나타낸다 EACCES 하지만, 부적절한 실행 퍼미션이 있는 파일에 대한 EACCES (와)과 혼란되지 않게 되어 있습니다. 4.4BSD 그리고, 이러한 함수는, EACCES, ENOENT, ENOEXEC 및 ETXTBSY 이외의 모든 에러로 돌아왔습니다. 이것은 종래의 에러 처리보다 뒤떨어진 것이었습니다. 패스 접두어에 대한 에러의 무시를 찢어, 비정상으로 애매한 에러 EFAULT (와)과 비정상인 에러 EIO 의 처리를 개량할 뿐(만큼)이기 때문입니다. 동작은 sh(1) 의 동작과 일치하도록(듯이) 변경되었습니다.

표준
execl(), execv(), execle(), execlp() 및 execvp() 하 p1003.1-88 에 준거하고 있습니다.