Manpages

이 름

execve − 프 로 그 램 을 실 행 한 다 .

사 용 법

#include <unistd.h>

int execve (const char *filename, char *const argv [], char *const envp[]);

설 명

execve()filename이 가 리 키 는 파 일 을 실 행 한 다 . filename은 바 이 너 리 실 행 파 일 이 거 나 "#! interpreter [arg]"와 같 은 라 인 으 로 시 작 하 는 스 크 립 트 파 일 이 어 야 한 다 . 후 자 의 경 우 , interpreter는 interpreter [arg] filename와 같 은 형 태 로 수 행 이 가 능 한 (스 크 립 트 가 아 닌 ) 바 이 너 리 실 행 파 일 이 어 야 한 다 .

argv는 새 로 이 실 행 할 프 로 그 램 에 전 달 하 는 인 수 문 자 열 의 배 열 이 다 . envp는 보 통 key=value과 같 은 형 태 의 문 자 열 배 열 이 며 환 경 변 수 를 설 정 해 놓 은 것 처 럼 전 달 된 다 . argvenvp는 모 두 NULL 포 인 터 로 끝 나 야 만 한 다 . 실 행 할 프 로 그 램 을 int main(int argc, char *argv[], char *envp[])와 같 이 정 의 하 면 인 수 문 자 열 배 열 과 환 경 변 수 를 main () 함 수 에 서 사 용 할 수 있 게 된 다 .

execve()가 성 공 할 경 우 반 환 하 지 않 는 다 . 그 리 고 호 출 된 프 로 세 스 는 호 출 한 프 로 세 스 의 텍 스 트 , 데 이 타 , bss와 스 택 을 덮 어 쓴 다 . 그 리 고 호 출 된 프 로 세 스 는 호 출 한 프 로 세 스 의 PID와 exec 시 닫 히 게 설 정 되 지 않 은 모 든 열 린 파 일 디 스 크 립 터 들 을 상 속 받 는 다 . 호 출 한 프 로 세 스 에 대 기 중 이 던 모 든 시 그 널 도 클 리 어 되 고 호 출 한 프 로 세 스 가 처 리 하 도 록 설 정 되 어 있 던 시 그 널 들 도 원 래 상 태 로 되 돌 아 간 다 .

호 출 한 프 로 그 램 을 ptrace(2) 로 추 적 하 고 있 었 다 면 execve()가 성 공 한 후 SIGTRAP이 전 달 된 다 .

만 약 filename가 가 리 키 는 실 행 파 일 의 set-uid 비 트 가 설 정 되 어 있 다 면 호 출 한 프 로 세 스 의 실 질 적 인 사 용 자 ID(uid)는 실 행 파 일 의 소 유 자 로 바 뀐 다 . 유 사 하 게 , 실 행 파 일 의 set-gid 비 트 가 설 정 되 어 있 다 면 호 출 한 프 로 세 스 의 실 질 적 인 그 룹 ID(gid)도 실 행 파 일 의 그 룹 으 로 바 뀐 다 .

만 약 실 행 파 일 이 동 적 라 이 브 러 리 와 링 크 되 고 공 유 라 이 브 러 리 stub을 포 함 하 는 a.out 형 식 이 라 면 프 로 그 램 수 행 전 에 리 눅 스 의 동 적 링 커 인 ld.so(8) 가 동 작 한 다 . 만 약 실 행 파 일 이 동 적 라 이 브 러 리 와 링 크 되 는 ELF 형 식 이 라 면 PT_INTERP 세 그 먼 트 가 가 리 키 는 이 름 의 인 터 프 리 터 가 공 유 라 이 브 러 리 를 로 드 하 기 위 해 동 작 할 것 이 다 . 그 인 터 프 리 터 는 보 통 리 눅 스 libc 버 전 5의 경 우 /lib/ld-linux.so.1이 며 , GNU libc 버 전 2의 경 우 보 통 /lib/ld-linux.so.2이 다 .

반 환 값

성 공 시 , execve()는 반 환 되 지 않 고 , 에 러 시 −1이 반 환 되 고 , errno 는 적 절 히 설 정 된 다 .

에 러

EACCES

파 일 이 나 스 크 립 트 인 터 프 리 터 가 정 규 파 일 이 아 니 다 .

EACCES

파 일 이 나 스 크 립 트 혹 은 ELF 인 터 프 리 터 에 실 행 권 한 이 없 다 .

EACCES

파 일 시 스 템 이 noexec 설 정 으 로 마 운 트 되 었 다 .

EPERM

파 일 시 스 템 이 nosuid 설 정 으 로 마 운 트 되 어 있 으 며 , 사 용 자 가 슈 퍼 유 저 가 아 니 고 파 일 이 SUID나 SGID 비 트 가 설 정 되 어 있 지 않 다 .

EPERM

프 로 세 스 가 추 적 (trace)되 고 있 으 며 , 사 용 자 가 슈 퍼 유 저 가 아 니 고 파 일 이 SUID나 SGID 비 트 가 설 정 되 어 있 다 .

E2BIG

인 수 리 스 트 가 너 무 크 다 .

ENOEXEC

실 행 파 일 이 알 아 볼 수 없 는 형 식 이 다 . 다 른 플 랫 폼 용 의 파 일 이 거 나 형 식 상 의 에 러 를 지 니 고 있 어 실 행 할 수 없 다 .

EFAULT

filename 이 접 근 할 수 없 는 주 소 영 역 을 가 리 킨 다 .

ENAMETOOLONG

filename 이 너 무 길 다 .

ENOENT

filename 혹 은 스 크 립 트 나 ELF 인 터 프 리 터 가 존 재 하 지 않 거 나 실 행 시 필 요 로 하 는 공 유 라 이 브 러 리 를 찾 지 못 했 다 .

ENOMEM

커 널 메 모 리 가 충 분 치 않 다 .

ENOTDIR

filename 혹 은 스 크 립 트 나 ELF 인 터 프 리 터 의 경 로 명 의 앞 부 분 경 로 명 (prefix)이 디 렉 토 리 가 아 니 다 .

EACCES

filename 혹 은 스 크 립 트 나 ELF 인 터 프 리 터 의 경 로 명 의 앞 부 분 경 로 명 이 가 리 키 는 디 렉 토 리 를 검 색 할 권 한 이 없 다 .

ELOOP

filename 혹 은 스 크 립 트 나 ELF 인 터 프 리 어 터 의 경 로 명 을 따 라 가 는 과 정 에 너 무 많 은 심 볼 릭 링 크 가 발 견 되 었 다 .

ETXTBSY

다 른 하 나 이 상 의 프 로 세 스 가 실 행 파 일 에 쓰 기 위 해 열 어 놓 았 다 .

EIO

I/O 에 러 가 발 생 하 였 다 .

ENFILE

시 스 템 에 서 생 성 할 수 있 는 최 대 파 일 개 수 에 도 달 하 였 다 .

EMFILE

프 로 세 스 가 열 수 있 는 최 대 파 일 개 수 에 도 달 하 였 다 .

EINVAL

ELF 실 행 파 일 이 하 나 이 상 의 PT_INTERP 세 그 먼 트 를 가 지 고 있 다 . (즉 ELF 인 터 프 리 터 를 하 나 이 상 가 리 키 고 있 다 .)

EISDIR

가 리 키 는 ELF 인 터 프 리 터 가 디 렉 토 리 다 .

ELIBBAD

ELF 인 터 프 리 터 가 알 수 없 는 형 식 이 다 .

호 환

SVr4, SVID, X/OPEN, BSD 4.3. POSIX은 #!실 행 을 문 서 화 하 지 않 았 지 만 , 그 외 에 는 호 환 성 이 있 다 . SVr4는 추 가 적 인 에 러 상 태 EAGAIN, EINTR, ELIBACC, ENOLINK, EMULTIHOP를 문 서 화 했 다 ; POSIX은 ETXTBSY, EPERM, EFAULT, ELOOP, EIO, ENFILE, EMFILE, EINVAL, EISDIR ,ELIBBAD 에 러 상 태 를 문 서 화 하 지 않 았 다 .

주 의

SUID와 SGID 프 로 세 스 들 은 ptrace()되 지 않 는 다 .

리 눅 스 는 스 크 립 트 의 SUID와 SGID 비 트 는 무 시 한 다 .

파 일 시 스 템 을 nosuid 설 정 으 로 마 운 트 했 을 때 의 결 과 는 리 눅 스 버 전 마 다 다 르 다 : 어 떤 버 전 의 리 눅 스 에 서 는 SUID/SGID 실 행 파 일 을 실 행 했 을 때 사 용 자 에 게 없 던 권 한 이 생 기 는 경 우 실 행 을 거 부 하 고 EPERM 에 러 를 반 환 한 다 . 다 른 버 전 의 리 눅 스 에 서 는 그 냥 SUID/SGID 비 트 를 무 시 하 고 성 공 적 으 로 수 행 할 것 이 다 .

#! 로 시 작 하 는 스 크 립 트 의 첫 라 인 의 최 대 크 기 는 127 byte이 다 .

관 련 항 목

chmod(2), fork(2), execl(3), environ(5), ld.so(8)

역 자

ASPLINUX<man [AT] asp-linux.kr>, 2000년 7월 29일
한 글 Manpage 프 로 젝 트 (http://man.kldp.org) 2004년 3월 23일