- path나 file에 지정한 명령이나 실행 파일을 실행함
- arg, envp로 시작하는 인자를 parh 나 file에 지정한 파일의 main 함수에 전달함
- exec 함수 실행되면 프로세스의 메모리 이미지는 실행파일로 바뀜
#include <unistd.h>
int execl(const char *path, const char *arg(), ... , const char *argn, (char *)0);
int execv(const char *path, char *const argv[]);
int execle(const char *path, const char *arg0, ... , const char *argn, (char *)0, char *const envp[]);
int execve(const char *path, char *const argv[]);
int execlp(const char *file, const char *arg0, ... , const char *argn, (char *)0);
int execvp(cosnt char *file, char *const argv[]);
- l : argument 다 나열해야 함
- v : 배열 형태로 인자 전달
- e : 환경변수 설정 해줘야 함
- p : file 형태로 줌
directory에 없는 경우에 path부터 해당 file이 있는지 확인 후 있다면 그 파일 실행함 - 함수 형태에 따라 NULL 값 지정에 주의해야 함
함수 사용
- POSIX 표준이라서 첫 인자는 실행파일명과 같게 해줘야 함
execlp
main() {
printf("--> Before exec function\n");
if (execlp("ls", "ls", "-a", (char *)NULL) == -1) { //인자의 끝을 표시하는 NULL 포인터
perror("execlp");
exit(1);
}
printf("--> After exec function\n"); //메모리 이미지가 ls 명령으로 바뀌어서 실행 안됨
}
execv
main() {
char *argv[3];
printf("--> Before exec function\n");
argv[0] = "ls"; //첫 인자는 실행파일명
argv[1] = "-a";
argv[2] = NULL; //인자의 끝 표시
if (execv("/bin/ls", argv) == -1) { //경로로 명령 지정, array 형태로 전달
//이때 경로를 지정하지 않으면 path부터 찾음 -> 명확하게 하기 위해서 정확한 경로 써줘야 함
perror("execv");
exit(1);
}
printf("--> After exec function\n"); //실행 안됨
}
execve
main() {
char *argv[3];
char *envp[2];
printf("--> Before exec function\n");
argv[0] = "arg.out"; //실행파일명 지정
argv[1] = "100";
argv[2] = NULL;
//환경변수 지정
envp[0] = "MYENV=hanbit";
envp[1] = NULL;
if (execve("./arg.out", argv, envp) == -1) { //실행파일 이름, 명령행 인자 값, 환경변수
//arg.out이 실행됨
perror("execve");
exit(1);
}
printf("--> After exec function\n"); //arg.out이 실행돼서 이건 실행되지 않음
}