exec 함수
fork 함수는 기존 프로세스에 자식 프로세스를 만들어 다음 코드 부터 실행하는 함수이다. fork함수는 다른 코드를 실행할 수 없다는 단점이 있다. 이 단점을 exec함수로 보완할 수 있다.
exec함수는 새로운 코드를 가져와서 실행시키는 함수를 말한다. 중요한 건 새로운 프로세스를 만드는 것이 아니라 새로운 코드를 가져와서 덮어쓰는 과정을 거친다는 말이다. 이를 통해서 기존 프로세스가 완전히 다른 프로세스로 변한다.

이와 같은 특징때문에 fork와 exec는 같이 쓰이곤 한다. fork를 통해 자식 프로세스를 만든 뒤, exec를 통해 부모와 완전히 다른 프로세스로 변하게 되고 결론적으로 다른 코드를 실행하게 된다.

다음은 쉘에서 cat 명령어를 사용하는 과정을 담은 사진이다. 쉘은 직접 수행하지 않고, fork를 통해 cat프로세스를 기다린다. 그동안 쉘은 wait하고 cat이 완료되면 결과물을 반환한다.

exec family
- exec로 시작하는 함수는 여러가지가 있다. 모든 exec family함수는 같은 동작을 실행한다. 단지 매개변수가 다를 뿐이다.
- exec는 새로운 코드를 통해 기존 프로세스를 새로운 프로세스로 교체한다. exec함수는 정상적으로 수행되면 return되지 않으며, exec함수의 밑 부분은 실행되지 않는다. - 그러나 error가 발생하면 return되므로 이를 통해서 error발생을 확인할 수 있다.
- exec는 문자, 변수, 스택, 힙등은 변경되나 환경변수같은 정보들은 상속되어서 사용한다.
- exec를 사용하려면 #include <unistd.h> 를 사용해야 한다.
코드의 종류
- execl
- int execl(const char *path, const char *arg0, …, const char *argn, (char*) 0);
- int execlp(const char* file, const char *arg0, …, const char *argn, (char*) 0);
- int execle(const char *path, const char *arg0, …, const char *argn, (char*) 0, char *const envp[]);
- execv
- 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[]);
- 모든 함수의 첫번째 매개 변수는 실행할 코드의 경로를 받는다.
execl
- execl은 여러 arg(매개 변수)를 직접 받는다.
- 이 arg는 실행할 코드의 매개변수나 옵션을 의미한다.
- 첫 arg는 실행하는 명령어를 의미하며, 그 뒤로는 옵션들이 온다.
- 끝을 알려주려면 NULL이나 0으로 알려준다.
- execl함수는 실행 명령어가 간단하거나 이미 실행하는 행동이 정해져있어 변경 사항이 없을 때 사용하면 좋다.
- execlp는 첫번째 매개 변수로 코드 경로가 아닌 코드의 이름을 넣어도 실행해주는 함수다. 매개 변수에 /(slash)가 포함되면 경로를, 아니면 이름으로 실행시켜준다.
- execle는 envp에 환경 변수를 추가로 받는다. 여기에 들어가는 환경 변수는 새로운 프로세스의 환경 변수로, 기존에는 부모의 환경 변수를 상속해서 받지만 이 함수를 사용하면 새로운 환경 변수를 설정할 수 있다.
execv
- execv는 argv(매개변수의 배열)를 받는다.
- argv는 다른 곳에 이미 정해져있다.
- 배열을 받는다는 점 때문에 함수 자체에서 NULL이나 0으로 알려 줄 필요는 없다.
- execv함수는 실행 명령어가 복잡하거나 많은 매개변수를 전달해야 하는 경우에 사용하면 좋다.
- 또한 실행하는 행동이 입력마다 달라지는 변경 사항이 많을 때 사용하면 좋다.
- execvp는 첫번째 매개 변수로 코드 경로가 아닌 코드의 이름을 넣어도 실행해주는 함수다. 매개 변수에 /(slash)가 포함되면 경로를, 아니면 이름으로 실행시켜준다.
- execve는 envp에 환경 변수를 추가로 받는다. 여기에 들어가는 환경 변수는 새로운 프로세스의 환경 변수로, 기존에는 부모의 환경 변수를 상속해서 받지만 이 함수를 사용하면 새로운 환경 변수를 설정할 수 있다.