Linux/Linux_programing

System - 03. exec () 계열. 프로세스 이미지 대체

sosal 2009. 10. 23. 23:50
반응형

/*
 http://sosal.tistory.com/
 * made by so_Sal
 */



exec 함수라는것은 사실 없고, exec 계열이라고 말한다.
exec로 시작되는 여러 함수를 통칭하여 exec 계열이라고 한다.

exec 계열의 함수는 프로세스를 대체해버린다.
system()함수는 프로세스 실행 도중에 다른 프로그램을 실행시켜 끝날때 까지 기다린후
새로 실행시킨 프로그램의 동작이 끝나게 되면 다시 원래 프로세스로 돌아와 일을 계속 한다.

하지만 exec 계열의 함수는 현재 프로세스를 새로운 프로그램으로 대체해버린다.
exec 함수들을 이용하면 현재 프로그램의 실행을 다른 프로세스에게 넘겨줄 수 있다.
새 프로그램이 시작된 후에는 원래의 프로그래밍 더 이상 실행될 필요가 없다는 점에서
system 함수보다 훨씬 효율적이다.

#include <unistd.h>

char **environ;
int execl(const char *path, const char *arg0, ..., (char *)0);
int execlp(const char *file, const char *arg0, ..., (char *)0);
int execle(const char *path, const char *arg0, ..., (char *)0, char llconst envp[]);

int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);

사실 6개 함수 모두 별 다를것이 없다.
이 함수들은 프로그램 인수들을 받는 방식에 따라 두 종류로 나뉜다.
execl, execlp, execle는 널 포인터로 끝나는 가변적인 개수의 매개변수들을 통해서 프로그램 인수를 받는다.
execv, exevp, execve는 문자열 배열 매개변수를 통해서 프로그램 인수들을 받는다.
두종류 모두 main함수의 argv[] 배열로 전달된다.

p로 끝나는 함수들은 주어진 프로그램 실행파일을 PATH 환경 변수에 설정된 경로들에서 찾는다.
환경변수에 등록되어있지 않은 프로그램이라면 디렉토리를 포함한 절대 경로를 지정해야함

ex) ps 명령 실행을 exec 함수를 이용해서 하는 방법 6가지

char *const ps_argv[] = {"ps", "ax", 0};
char *const ps_envp[] = { "PATH=/bin:/usr/bin", "TERM=console", 0 };

execl("/bin/ps", "ps", "ax", 0); //절대경로를 입력하여 argv[0]에 ps, argv[1]에 ax 전달, 0은 끝을 의미
execlp("ps","ps", "ax", 0); //bin이 PATH 환경변수에 있다고 가정
execle("/bin/ps","ps","ax", 0, ps_envp); //환경을 직접 전달..

execv ("/bin/ps", ps_argv); //절대경로와, 인자가 들어가있는 배열을 넘겨준다.
execvp("ps", ps_argv); //환경변수
execve("/bin/ps", ps_argv, ps_envp); //환경 직접 전달

사실 6개 다 별 다를것이 없는 함수들이다.

그럼 완전한 하나의 프로그램을 보자. 환경변수를 이용한 exec계열 함수 execlp를 사용한다.

//  03.execlp.c  //  03.execlp.exe // begining Linux programing 소스
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main(){
    printf("Running ps with execlp\n");
    execlp("ps","ps","ax",0);
    printf("done..\n");
    exit(0);
}


만약 system 함수였다면 ps ax의 마지막 줄이 출력되고 done.. 으로 마무리가 되었어야 하는데
execlp 함수에서는 찾아볼 수 없네요.
exec 계열 함수는 다른 프로세스로 대체하여
      제어권이 이전의 프로세스로 다시 돌아오지 않는다걸 확인할 수 있습니다.


exec의 상속성 **

exec가 띄운 새 프로세스는 원래의 프로세스의 여러 특징을 물려받습니다.
pid ppid (프로세스 고유 아이디, 부모 프로세스 고유 아이디) 역시 이전 프로세스와 완전히 일치합니다.
특히 열린 파일 서술자들은 새 프로세스에서도 여전히 열린 상태입니다.
하지만 "exec 수행 시 닫음" 플래그를 설정한 경우에는 그렇지 않습니다. -> 모든 파일 서술자 닫힘
//Linux_technic 게시판에서 fcntl 관련 게시물을 참조하세요

이 게시물의 참고서적입니다.
1. begining Linux programing 4th
2. Advanced Unix programming
3. Linux 언쉬리드