C언어 다른 프로그램 실행 함수execve()

2020. 3. 15. 12:01 컴퓨터/프로그래밍

C함수 다른 프로그램 실행 execve()

다른 프로그램을 실행하고 자신은 종료합니다. execle() 이나 execve() 처럼 exec 함수 중 e 로 끝나는 함수는 환경변수를 지정할 수 있습니다.

  • 헤더: unistd.h
  • 형태: int execle( const char *path, const char *arg , ..., char * const envp[])
  • 인수: char *char 디레토리 포함 전체 파일 명
    const char *arg 인수 목록
    char * const envp[] 환경 설정 목록
  • 반환: 실패일 때만 -1

execle() 과의 차이점은 프로그램의 인수와 환경변수 목록을 모두 이중 배열로 처리했다는 점입니다. execle()함수는

char *envp[]   = { "HTTP=badayak.com", NULL};

execle( "./show_envp", "./show_envp", "HTTP", NULL, envp);

execve() 함수는 아래와 같습니다.

char *argv[]   = { "./show_envp", "HTTP", NULL};
char *envp[]   = { "HTTP=badayak.com", NULL};

execve( "./show_envp", argv, envp);

exec 함수에는 아래와 같이 여러 가지가 있습니다.

함수 이름
int execl( const char *path, const char *arg, ...)
int execlp( const char *file, const char *arg, ...)
int execle( const char *path, const char *arg ,..., char * const envp[])
int execv( const char *path, char *const argv[])
int execvp( const char *file, char *const argv[])
int execve (const char *filename, char *const argv [], char *const envp[])

각 함수는 아래와 같은 차이가 있습니다.

함수 이름 프로그램 지정 명령라인 인수 함수 설명
execl 디렉토리와 파일 이름이 합친 전체 이름 인수 리스트 환경 설정 불가
execlp 파일 이름 인수 리스트 환경 설정 불가
execle 디렉토리와 파일 이름이 합친 전체 이름 인수 리스트 환경 설정 가능
execv 디렉토리와 파일 이름이 합친 전체 이름 인수 배열 환경 설정 불가
execvp 파일 이름 인수 배열 환경 설정 불가
excve 전제 경로 명 인수 배열 환경 설정 가능

프로그램 지정에서 디렉토리와 파일 이름이 합친 전체 이름으로 지정하는 것과 파일 이름만 지정하는 것의 차이는, execl()처럼 전체 이름을 요구하는 함수는 지정한 디렉토리의 프로그램을 실행하지만 execlp()함수처럼 프로그램 이름만 요구하는 함수는 현재 PATH 환경에 등록된 디렉토리를 있는 프로그램을 실행합니다.

즉,

execl()은 아래와 같이 프로그램이 들어 있는 디렉토리명까지 입력해 주어야 합니다.

execl( "/bin/ls", "/bin/ls", NULL);

아래와 같이 프로그래명만 입력하면 실행이 안 됩니다.

execl( "ls", "ls", NULL);

그러나 execlp()는 PATH에 등록된 모든 디렉토리에 있는 프로그램을 실행하므로 프로그램 이름만 입력해도 실행이 됩니다.

execlp( "ls", "ls", NULL);
인수 중복 이유

설명을 보면 프로그램 이름을 중복해서 입력했는데요, 이는 프로그램을 실행하면 첫 번째 인수가 실행한 프로그램의 전체 이름이기 때문입니다. man()함수의 인수 중 *argv[]의 첫 번째 문자열 argv[0]은 실행한 프로그램의 전체 이름입니다.

int main( int argc, char *argv[])
{
   printf( "%s\n", argv[0]);
   return 0;
}

예로

   ]$ ./a.out

으로 실행했다면 argv[0]은 "./a.out"이 되며,

   ]$ /home/jwjw/prjs/test_fun/a.out

으로 실행했다면 argv[0]은 "/home/jwjw/prjs/test_fun/a.out"이 됩니다. 프로그램에서 첫 번째 인수를 사용할 수 있으므로 파일의 전체 이름을 입력해 주는 것이 좋습니다.

예제

execle() 작동을 확인하기 위해, 환경변수를 출력하는 프로그램을 먼저 작성하겠습니다.

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

int main( int argc, char *argv[])
{
   if (1 < argc)  printf( "환경변수 %s는 %s\n", argv[1], getenv( argv[1]));
   else           printf( "실행방법: show_envp [환경변수]\n");
   return 0;
}

프로그램 소스를 test.c로 저장한 후 실행 파일을 show_envp로 컴파일합니다.

]$ gcc test.c -o show_envp
]$ ./show_envp  HOME
환경변수 HOME는 /home/jwjw
]$

이제 환경 변수를 설정하고 show_envp를 실행시켜 보겠습니다.

#include <stdio.h>
#include <unistd.h>

int main()
{
   char *argv[]   = { "./show_envp", "HTTP", NULL};
   char *envp[]   = { "HTTP=badayak.com", NULL};

   execve( "./show_envp", argv, envp);

   printf( "이 메시지가 보이면 지정된 프로그램이 \
없거나 어떤 문제로 실행되지 못한 것입니다.\n");
}

컴파일 후 실행합니다.

]$ ./a.out
환경변수 HTTP는 badayak.com
]$
이 댓글을 비밀 댓글로

티스토리 로그인이 풀리면 여기를 클릭하세요.

error: Content is protected !!