[리눅스 시스템 프로그래밍] 7.9 새로운 프로그램 이미지 실행, exec 함수군

리눅스 시스템에서는 현재 수행하고 있는 프로세스를 새로운 프로그램 이미지로 실행시키는 시스템 호출을 제공하고 있습니다. 전달할 인자에 따라 execl, execv, execle, execve, execlp, execvp 로 나눌 수가 있어요.

#include <unistd.h >

int execl(char *path, char *arg0, char *arg1, …, char *argn, (char *)0);

int execv(char *path, char *argv[]);

int execle(char *path, char *arg0, char *arg1, …, char *argn, (char *)0, char *envp[]);

int execve(char *path, char *argv[], char *envp[]);

int execlp(char *file, char *arg0, char *arg1, …, char *argn, (char *)0);

int execvp(char *file, char *argv[]);

exec 함수군의 첫 번째 입력 인자는 실행할 프로그램의 경로입니다. 만약 함수명 끝에 ‘p’가 붙으면 환경 변수 PATH에 있는 명령인지 확인하므로 이럴 때는 경로를 전달하지 않고 파일명만 전달할 수 있습니다.

그리고 함수명에 ‘l’이 있을 때는 명령행 인자를 순차적으로 전달하며 마지막 전달할 명령행 인자 뒤에 0을 추가로 전달하여 더 이상 명령행 인자가 없는 것을 구분합니다. 그리고 ‘v’가 있을 때는 명령행 인자를 벡터(char *argv[])로 전달합니다. 그리고 ‘e’가 있을 때는 환경 변수를 전달합니다.

[그림 7.14] exec 함수군의 관계
[그림 7.14] exec 함수군의 관계

프로세스는 exec 호출로 프로그램 이미지가 바뀌어도 다음 항목은 변하지 않습니다.

 프로세스 ID, 부모 프로세스 ID, 프로세스 그룹 ID, 세션 ID

실제 사용자 ID, 실제 그룹 ID, 보조 그룹 ID

현재 디렉토리, root 디렉토리

지연 시그널, alarm 시그널 발생까지 남은 시간

자원 제약, tms_utime, tms_stime, tms_cutime

파일 생성 모드의 마스크, 프로세스 시그널 마스크

다음은 exec 사용 예제에서 실행에 사용할 더미 프로그램의 예제 코드입니다. 단순히 main 함수 인자를 출력하는 프로그램입니다.

/**********************************************************************
* ex_dummy.c                                                          *
* exmple source – exec target program                                 *
**********************************************************************/

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    printf("argument count is %d\n", argc);

    int i=0;
    printf("arugment list\n");
    for(i=0; i< argc; i++)
    {
        printf("<%d>: %s\n", i, argv[i]);
    }

    return 0;
}

그리고 다음은 exec를 사용하는 예제 코드입니다. fork하여 프로세스를 생성한 후 자식 프로세스에서는 main 함수 인자로 전달한 값을 bypass하여 argv[1]을 실행합니다. 그리고 부모 프로세스는 자식 프로세스의 종료를 기다립니다.

/**********************************************************************
* ex_exec.c                                                           *
* exmple source – exec function Usages example                        *
**********************************************************************/

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    if(argc == 1)
    {
        printf("Usage: %s <exec path> , [arg0, arg1, arg2, ...]\n", argv[0]);
        return 1;
    }

    pid_t pid = fork();
    if(pid < 0)
    {
        perror("fork error");
        return 1;
    }

    if(pid == 0)
    {
        wait(0);
    }
    else
    {
        execv(argv[1],argv+1);
        return 0;
    }

    return 0;
}
[그림 7.15] ex_exec 실행 화면
[그림 7.15] ex_exec 실행 화면