EXECVE(2)

명칭
execve - 파일을 실행한다

프로그램 라이브러리
libc

서식
#include <unistd.h> int execve(const char *path, char *const argv[], char *const envp[])

해설
execve() (은)는 호출 프로세스를 새로운 프로세스로 변환합니다. 새로운 프로세스는 new process file (으)로 불리는 통상의 파일에 따라 구성됩니다. 이 파일의 이름은 path 에 의해 지정됩니다. 이 파일은 실행 가능 오브젝트 파일, 또는 인터프리터용의 데이터의 파일입니다. 실행 가능 오브젝트 파일은, 식별 헤더에 데이터의 페이지가 계속된 것으로 구성됩니다. 이 데이터는 초기 프로그램 (텍스트)과 초기치 있어 데이터의 페이지를 나타냅니다. 추가의 페이지는 헤더의 지정에 의해 0 데이터로 초기화되는 경우가 있습니다. elf(5) 및 a.out(5) (을)를 참조해 주세요.

인터프리터 파일은 다음의 형식의 행으로 개시합니다.

#! 인터프리터 [arg]

인터프리터 파일이 execve 될 때, 시스템은 실제로는 지정의 인터프리터 (을)를 execve 합니다. 옵션의 arg 하지만 지정되어 있는 경우, 그것은 인터프리터 의 1번째의 인수에 되어, 원래의 execve 그리고 지정된 파일의 이름은 2 번째의 인수가 됩니다. 그 이외에서는 execve 그리고 지정된 파일의 이름이 1번째의 인수가 됩니다. 원래의 인수는 쉬프트 되어 후속의 인수에 됩니다. 0 번째의 인수는 지정되었다 인터프리터 (으)로 설정됩니다.

인수 argv (은)는, 눌로 종료하는 캐릭터 포인터의 배열을 가리키는 포인터입니다. 각 캐릭터 포인터는 눌 캐릭터로 종료하는 캐릭터 라인을 가리킵니다. 이러한 캐릭터 라인은, 새로운 프로세스로부터 참조할 수 있는 인수 리스트를 구성합니다. 적어도 1 개의 인수가 배열내에 존재하고 있을 필요가 있습니다. 관습에서는, 최초의 요소가 실행된 프로그램의 이름이 될 것입니다 (예를 들어, path 의 마지막 원가요소).

인수 envp 도, 눌로 종료하는 캐릭터 포인터의 배열을 가리키는 포인터입니다. 각 캐릭터 포인터는 눌 캐릭터로 종료하는 캐릭터 라인을 가리킵니다. 이 배열을 가리키는 포인터는, 통상, 글로벌 변수 environ 에 보존됩니다. 이러한 캐릭터 라인은, 인수로서 명령에 직접 건네받지 않는 정보를 새로운 프로세스에 건네줍니다 (environ(7) (을)를 참조).

호출 프로세스 이미지내에서 오픈되고 있는 파일 기술자는, 새로운 프로세스 이미지 중(안)에서도 오픈된대로 입니다. 그러나, close-on-exec 플래그가 설정되어 있는 것은 예외입니다. (close(2) (와)과 fcntl(2) (을)를 참조). 오픈된 채로의 기술자는 execve() 의 영향을 받지 않습니다.

호출 프로세스로 무시하도록(듯이) 설정된 시그널은, 새로운 프로세스내에서도 무시되도록(듯이) 설정됩니다. 호출 프로세스 이미지내에서 포착되도록(듯이) 설정된 시그널은, 새로운 프로세스 이미지내에서 디폴트의 액션에 설정됩니다. 블록 된 시그널은, 시그널 액션의 변화 (와)는 관계없는 것으로 블록 된 채로 있습니다. 시그널 스택은 미정도리에 리셋트 됩니다 (상세한 것에 대하여는 sigaction(2) (을)를 참조해 주세요).

새로운 프로세스 이미지 파일에 set-user-ID 모드 비트 하지만 설정되어 있는 경우 (chmod(2) (을)를 참조), 새로운 프로세스 이미지의 실효 유저 ID 는, 새로운 프로세스 이미지 파일의 소유자 ID 로 설정됩니다. 새로운 프로세스 이미지 파일에 set-group-ID 모드 비트가 설정되어 있는 경우, 새로운 프로세스 이미지의 실효 그룹 ID 는 새롭다 프로세스 이미지 파일의 그룹 ID 로 설정됩니다 (실효 그룹 ID 는 그룹 리스트의 최초의 요소입니다). 새로운 프로세스의 열매 유저 ID, 열매 그룹 ID, 및 그 외의 그룹 ID 는, 호출 프로세스 이미지와 같게 됩니다. set-user-ID 및 set-group-ID 처리의 뒤, 실효 유저 ID 는 saved set-user-ID 로서 기록되어 실효 그룹 ID 는 saved set-group-ID 로서 기록됩니다. 이러한 값은, 다음에 실효 ID 를 변경하는데 사용할 수 있습니다 (setuid(2) (을)를 참조).

해당하는 파일 시스템으로 nosuid 옵션이 유효한 경우, 또는 새로운 프로세스 파일이 인터프리터 파일의 경우, set-ID 비트는 의미를 가지지 않습니다. 실효 ID 가 변경되었을 경우, 시스템 콜의 트레이스는 무효가 됩니다.

또, 새로운 프로세스는 호출해 프로세스로부터 다음의 속성을 계승합니다.

프로세스 ID | getpid(2)  를 참조
parent process ID | getppid(2)  를 참조
프로세스 그룹 ID | getpgrp(2)  를 참조
액세스 그룹 | getgroups(2)  를 참조
작업 디렉토리 | chdir(2)  를 참조
루트 디렉토리 | chroot(2)  를 참조
제어 단말 | termios(4)  를 참조
리소스의 사용 상황 | getrusage(2)  를 참조
인터벌 타이머 | getitimer(2)  를 참조
리소스의 사용 제한 | getrlimit(2)  를 참조
파일 모드 마스크 | umask(2)  를 참조
시그널 마스크 | sigvec(2),
sigsetmask(2) 를 참조

execve() 호출의 결과로서 실행될 때, 프로그램은 다음과 같이 불려 갑니다.

    main(argc, argv, envp)
    int argc;
    char **argv, **envp;

여기서, argc 하 argv 의 요소수 (``arg count'')이며, argv (은)는, 인수 자신을 가리키는 캐릭터 포인터의 배열을 가리킵니다.

반환값
execve() (은)는 현재의 프로세스 이미지를 새로운 프로세스 이미지로 덧쓰기하므로, 처리가 성공한 호출에는 돌아오는 프로세스가 없습니다. execve() 하지만 호출 프로세스에 되돌아 오는 경우는 에러가 일어나고 있습니다. 반환값은 -1 으로, 에러를 나타내기 위해서(때문에) 글로벌 변수 errno 하지만 설정됩니다

에러
다음의 경우, execve() (은)는 처리에 실패해, 호출 프로세스로 돌아옵니다.

[ENOTDIR]
    패스의 원가요소중에 디렉토리 이외의 것이 포함되어 있습니다.

[ENAMETOOLONG]
    패스명의 원가요소가 255 캐릭터를 넘고 있는지, 또는 패스명 전체가 1023 캐릭터를 넘고 있습니다.

[ENAMETOOLONG]
    인타프리트 되는 스크립트를 기동할 경우에, 인터프리터의 이름이 MAXSHELLCMDLEN 캐릭터를 넘고 있습니다.

[ENOENT]
    새로운 프로세스 파일이 존재하지 않습니다.

[ELOOP]
    패스명을 변환할 경우에 검출된 기호 연결이 너무 많습니다.

[EACCES]
    지정된 패스에는, 검색이 허가되어 있지 않은 디렉토리가 포함되어 있습니다

[EACCES]
    새로운 프로세스 파일이 통상의 파일이 아닙니다.

[EACCES]
    새로운 프로세스 파일은, 실행이 허가되고 있지 않습니다.

[ENOEXEC]
    새로운 프로세스 파일에 적절한 액세스 허가가 있습니다만, 헤더의 매직 번호가 무효입니다.

[ETXTBSY]
    새로운 프로세스 파일은 순수한 수속 (공유 텍스트) 파일로, 현시점에서 다른 프로세스에 의해 기록 또는 읽기용으로 오픈되고 있습니다.

[ENOMEM]
    새로운 프로세스는, 용서되었다 (getrlimit(2) 로 부과된 최대치) 이상의 가상 메모리를 필요로 합니다.

[E2BIG]
    새로운 프로세스의 인수 리스트의 바이트수가 시스템의 부과한 상한을 넘고 있습니다. 이 상한은, sysctl(3) 의 MIB 변수 KERN_ARGMAX 에 의해 지정됩니다.

[EFAULT]
    새로운 프로세스 파일은, 헤더내의 사이즈치로 나타나는 만큼 길게 없습니다.

[EFAULT]
    path, argv, 또는 envp 하지만 올바르지 않은 주소를 가리키고 있습니다.

[EIO]
    파일 시스템으로부터 독해간에 입출력 에러가 발생했습니다.

경고
슈퍼 유저가 아닌 것에 대해서 setuid 된 프로그램이, 열매 uid 하지만 ``root''의 때에 실행되었을 경우, 프로그램은 부분적으로 슈퍼 유저의 권한을 가집니다.

관련 항목
ktrace(1), fork(2), _exit(2), execl(3), exit(3), sysctl(3), a.out(5), elf(5), environ(7), mount(8)

역사
execve() 함수는 4.2BSD 그리고 등장했습니다.