부모 프로세스(Parent process)에서 fork() 실행을 통해 자식 프로세스(Child process)를 생성하며, 이는 트리 구조(Process tree)를 형성한다.
fork()는 현재 실행 중인 프로세스를 복사하여 다른 프로세스를 생성하는 시스템 콜이다.
#include <stdio.h>
int main() {
// 프로세스 번호 (Process ID; PID)가 저장될 변수 pid
pid_t pid;
// 자식 프로세스를 생성한다.
// 성공시 0, 실패시 -1, 부모 프로세스이면 양수 (프로세스 ID)를 반환한다.
pid = fork();
if (pid < 0) {
// pid 가 음수이면 에러가 난 것이다.
fprintf(stderr, "fork failed!");
return -1;
} else if (pid == 0) {
// pid 가 0 이면 자식 프로세스이다.
// 자식 프로세스가 해야 할 일을 선언한다.
printf("자식 프로세스 (# %i)", getpid());
} else {
// pid 가 양수이면 부모 프로세스이다.
// 부모 프로세스가 해야 할 일을 선언한다.
printf("부모 프로세스 (# %i)", getpid());
// 자식 프로세스들이 모두 종료될 때 까지 기다린다.
wait(&status);
}
return 0;
}
fork()가 새로운 프로세스를 복사하는 기능이라면, exec()는 프로세스는 그대로 둔 채 내용만 바꾸는 기능이다.
fork() vs exec()
fork()는 새로운 프로세스를 위한 메모리를 할당하지만 exec()은 메모리를 할당하지 않고, exec()에 의해 호출된 프로세스만 메모리에 남게된다.
결과적으로 fork()는 프로세스가 하나 더 생기는 것이고, exec()는 생성되는 새로운 프로세스는 없고, PID가 그대로 새로운 프로세스에 적용되며, 호출한 프로세스가 새로운 프로세스에 의해 덮어 쓰여지게 된다.