본문 바로가기

개발/Linux

프로세스와 신호 - 프로세스 이미지 대체하기

반응형

프로세스 이미지 대체하기

#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 execl (const char *path, char *const argv[], char *const evnp[]);


- execl, execlp, execle는 널 포인터로 끝나는 가변적인 개수의 매개변수들을 통해서 프로그램 인수들을 받는다.

 - execv, execp, execl은 문자열 배열 매개변수를 통해 프로그램 인수를 받는다. 

 - 두 종류 모두 main 함수의 argv 배열로 전달된다.


 - p로 끝나는 함수들은 주어진 프로그램 실행 파일을 PATH 환경 변수에 설정된 경로들에서 찾는다. 그렇기 때문에 경로에 있는 것이 아닌 프로그램을 실행한다면 절대경로를 지정해야한다. 

 - e로 끝나는 함수들에게서는 마지막 매개변수로 프로그램 환경을 담은 문자열 배열을 지정할 수 있다.


소스


실행결과 (아래만)

실행이 끝났는데도 "Done."이 출력되지 않는다. -> 이것이 바로 system과 다른점!!! 실행이 끝나도 제어권이 해당 프로그램으로 돌아오지 않는다!! 

그래서 새 프로세스의 PID는 원래의 PID와 동일! 무모 PID나 예의 바름 값도 동일! 

exec로 프로세스를 띄울 때는 인수목록과 환경이 결합된 크기에 상한이 존재한다. 그 상한은 ARG_MAX로 정의 되는데 리눅스의 경우 128KB 이지만, 더 낮은 상한을 가진 시스템이 있을 수 있다. POSIX 명세가 요구하는 ARG_MAX 의 최소 값은 4096바이트이다. 

exec 함수들은 오류가 발생할 때만 반환되고, 오류가 발생하면 errno가 설정되며 -1을 반환한다. 


반응형