execve 함수란?
실행 가능한 파일인 fileaname의 실행 코드를 현재 프로세스에 적재하여 기존의 실행코드와 교체하여 새로운 기능으로 실행한다. 즉, 현재 실행되는 프로그램의 기능은 없어지고 filename 프로그램을 메모리에 loading 하여 처음부터 실행한다.
UNIX/LINUX에서는 프로세스 생성(fork)과 실행할 binary 교체(exec 계열 함수)는 분리되어 있다.
execve의 의미
execve
는 exec 계열이다. exec 뒤에 붙은 글자의 의미는
- l : argv가 list로 나열된다는 의미. 끝은 NULL
- v : argv가 vector(배열)로 parameter를 하나를 받는다는 의미이다. 배열의 마지막 값은 NULL
- p : 첫 번째 파라미터인 명령어/실행파일이 PATH로 지정된 디렉토리에 있다면 절대 경로나 상대 경로로 하지 않아도 된다는 뜻이다.
- e : 설정할 환경 변수를 파라미터로 받는다는 의미이다.
따라서 execve의 의미는 배열의 마지막이 NULL인 배열을 인자로 받고, 설정할 환경 변수를 인자로 받는다는 의미
execve
#include <unistd.h>
int execve(const char *filename, char *const argv[], char *const envp[]);
파라미터
- filename
- 교체할 실행 파일 / 명령어
- filename은 실행가능한 binary이거나 shell이어야 한다.
- filename은 path가 설정되어 있는 디렉토리라고 하더라고 절대 경로나 상대 경로로 정확한 위치를 지정해야 한다.
- argv
- main(int argc, char *argv[]) 에서의 argv와 비슷하며, main 함수에는 argc가 있지만 execve에는 argc가 없으므로 main의 argv에 마지막 array 다음은 NULL이 있다.