exec로 호출되는 프로그램은 현재 메모리에 올라와 있는 프로그램을 덮어서 로딩된다.
별도의 메모리 공간을 할당하고 그 할당된 공간에서 exec를 실행하게 되면 다른 메모리 공간에서 실행되고 있는 원레의 프로세스는 자기 일을 할 수가 있다. 이런 일을 해주는 것이 fork이다.
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
pid_t pid;
printf("Before the fork()\\n");
pid = fork();
if (pid == 0)
printf("This is a Child. PID = %d\\n", pid);
else if (pid > 0)
printf("This is a Parent. PID = %d\\n", pid);
else
printf("Fork is failed!!\\n");
}
위 프로그램에서 pid = fork()가 시행되는 순간, 위 프로세스와 똑같은 프로세스 하나가 별도의 메모리 공간에 생성된다. 이 때 두 프로세스의 변수 값, PC(Program Count) 값은 정확히 똑같다. 다만 pid 값만 유일하게 달라진다.
따라서 pid 값을 이용해 Child Process가 할 일을 하게 하고, Parent Process가 할 일을 하게 하면 된다.
exec는 어떤 일을 하게 하는 family 명칭이다.
exec family가 하게 하는 일은 현재 실행되는 프로세스에서 다른 프로세스 일을 하게 하는 것이다.
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("executing ls\\n");
execl("/bin/ls", "ls", "-l", (char *) 0);
perror("execl failed to run ls");
exit(1);
}
exec family는 다른 Process를 실행시킬 때 현재 Process 메모리 공간에 덮어 써 버린다. 따라서 exec 함수가 성공하면 perror
는 실행되지 않는다. 이미 ls -l
프로세스가 메모리 공간에 덮어 써 버려졌고, 이후 명령들은 찾을 수 없기 때문이다. 그러나 exec가 실패했다면 ls -l
프로세스가 메모리 공간에 로딩되어지지 않기 떄문에 perror가 실행 될 것이다.