열렬히.뛰기

exec()

école 42 > pipex > pipex : 시스템 콜 > exec()

🔎 exec()

c
#include <unistd.h>

extern char **environ;

int execl(const char *pathname, const char *arg, ... /*, (char *) NULL */);
int execlp(const char *file, const char *arg, ... /*, (char *) NULL */);
int execle(const char *pathname, const char *arg, ... /*, (char *) NULL, char *const envp[] */);
int execv(const char *pathname, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);

system()함수는 OS가 명령 문자열을 보고 프로그램을 실행하는 함수인데 보안이 허술해 악의적인 사용자가 명령 문자열을 악의적으로 조작이 가능했고,

그리하여 나온 것이 exec() 계열 함수다.

exec()는 현재 실행중인 프로세스를 종료하고 해당 프로세스를 대체하여 실행한다. unistd.h에 선언돼 있다.

exec() 계열 함수를 호출하면 새 프로세스(외부 프로그램이)가 실행되고 해당 프로세스는 종료된다.

exec 는 대동소이 하지만 사용법은 조금씩 다르다.
l : argv를 list로 나열. 끝 인자는 NULL을 넣어줘야 함.
v : argv를 vector(포인터)로 받는다는 뜻. 마지막 인자값은 NULL
p : 프로그램 디렉토리를 PATH 환경변수에서 참조하여 파일을 실행.
e : 환경변수를 인자로 받아 변경할 수 있음.

주의할점은 execve()만 시스템 콜 함수라는 것이다.

c
#include <unistd.h>
int execve(const char *pathname, char *const argv[], char *const envp[]);