Linux,  Programming

[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

기존 execve를 추가해서 환경변수를 함께 전달시킬 수 있다. 아래는 예시 코드다. 이 때도 실제 실행 프로그램은 따로 작성해줘야 한다.

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

  1. http://forum.falinux.com/zbxe/index.php?document_srl=408554&mid=C_LIB

Leave a Reply

Your email address will not be published. Required fields are marked *