[Linux] exec 계열 함수
exec 계열 함수들은 현재의 프로세스 이미지를 새로운 프로세스 이미지로 덮어쓴다. exec 계열 함수들은 library 함수로 구성된다.
exec 계열 함수를 통해서 fork()로 child process를 만든 뒤 독립적인 process로 만들어주는 역할을 한다. 각 exec 함수들은 argument를 넘기는 방식이 조금씩 다르다.
- l: List 형태의 명령라인 argument (argv[0], argv[1], …)
- v: Vector 형태의 명령 argument (argv[])
- e: 환경변수 인자 (envp[])
- p: Path 정보가 없는 실행파일 이름
그리고 execve 함수만이 kernel 내 system call 함수고 나머지 함수들은 library 함수다. 대표적인 exec 계열 함수는 아래와 같다.
| 함수 이름 | 프로그램 지정 | 명령라인 인수 | 함수 설명 |
|---|---|---|---|
| execl | 디렉토리와 파일 이름이 합친 전체 이름 | 인수 리스트 | 환경 설정 불가 |
| execlp | 파일 이름 | 인수 리스트 | 환경 설정 불가 |
| execle | 디렉토리와 파일 이름이 합친 전체 이름 | 인수 리스트 | 환경 설정 가능 |
| execv | 디렉토리와 파일 이름이 합친 전체 이름 | 인수 배열 | 환경 설정 불가 |
| execvp | 파일 이름 | 인수 배열 | 환경 설정 불가 |
| excve | 전제 경로 명 | 인수 배열 | 환경 설정 가능 |
execl
int execl( const char *path, const char *arg, ...);
List 형태로 argument를 새로운 process로 넘겨준다.
Example
#include <unistd.h>
int main() {
// 실행하고자 하는 program, program 이름, argument 0, argument 1
execl("./a.out", "a.out", "arg0", "arg1", (char *)0);
return 0;
}
위 예제 코드처럼 우리가 실행하고자 하는 프로그램을 새로운 이름, argument 등을 list 형태로 전달해서 수행시킨다.
execv
Vector 형태로 인자를 넘겨준다.
Example
#include <unistd.h>
int main() {
//program 이름, argument 0, argument 1
char *argv[] = {"a.out", "arg0", "arg1", (char *)0};
execv("./a.out", argv);
return 0;
}
execve
기존 execv에 e를 추가해서 환경변수를 함께 전달시킬 수 있다. 아래는 예시 코드다. 이 때도 실제 실행 프로그램은 따로 작성해줘야 한다.
Example
#include <unistd.h>
int main() {
//program 이름, argument 0, argument 1
char *argv[] = {"a.out", "arg0", "arg1", (char *)0};
char *env[] = {"locate = korea", "age = 20", (char *)0};
execve("./a.out", argv, env);
return 0;
}
execlp
만약 우리가 ls라는 프로그램을 exec 함수를 써서 실행시킨다고 했을 때, 실제 ls program의 절대 경로를 명시를 해줘야한다. 이런 부분이 번거스럽기 때문에 p option이 붙은 exec 계열 함수를 쓰면 유용하게 사용 가능하다.
이때 절대 경로는 환경변수에 적힌 경로를 모두 뒤져서 확인하게 된다. ls의 경우 /bin/ls를 alias 해서 사용하기 때문에 해당 경로로 접근한다.
Example
#include <unistd.h>
int main() {
execlp("ls", "ls", "-l", (char *)0);
// execl("/bin/ls", "ls", "-l", (char *)0);
return 0;
}
Reference
- http://forum.falinux.com/zbxe/index.php?document_srl=408554&mid=C_LIB