[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