이번 글에서는 C 언어의 fork() 시스템 콜에 대해 자세히 알아보겠습니다. fork()는 새로운 프로세스를 생성하는 데 사용되는 시스템 콜로, 새로 만들어진 프로세스를 자식 프로세스(child process)라고 부릅니다. 반면, 자식 프로세스를 생성한 현재 프로세스는 부모 프로세스(parent process)라고 합니다.
자식 프로세스는 부모 프로세스가 사용하던 프로그램 카운터(program counter), CPU 레지스터, 그리고 열려 있던 파일들을 그대로 물려받아 사용합니다. 즉, fork() 호출 시점에 부모 프로세스의 실행 상태가 자식 프로세스에 그대로 복사됩니다.
fork()의 반환값
fork() 함수는 어떠한 매개변수도 받지 않으며, 정수 값을 반환합니다. 반환되는 정수 값은 다음과 같은 세 가지 유형으로 구분됩니다.
음수(Negative Number): 자식 프로세스 생성에 실패했을 경우 음수를 반환합니다.
0(Zero): 새로 생성된 자식 프로세스에게는 0을 반환합니다.
양수(Positive Value): 부모 프로세스에게는 양수, 즉 자식 프로세스의 PID(프로세스 ID)를 반환합니다.
이러한 반환값의 차이를 활용하면 코드 내에서 부모 프로세스와 자식 프로세스가 서로 다른 작업을 수행하도록 분기 처리할 수 있습니다.
예제 코드
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
fork(); // 동일한 유형의 자식 프로세스 생성
printf("Fork testing code\n");
return 0;
}실행 결과
soumyadeep@soumyadeep-VirtualBox:~$ ./a.out Fork testing code soumyadeep@soumyadeep-VirtualBox:~$ Fork testing code soumyadeep@soumyadeep-VirtualBox:~$
출력 결과 분석
위 실행 결과를 보면 "Fork testing code"라는 문장이 두 번 출력된 것을 확인할 수 있습니다. 그 이유는 fork() 호출 이후 하나의 프로그램이 부모 프로세스와 자식 프로세스, 두 개의 독립적인 프로세스로 나뉘어 실행되기 때문입니다. fork()가 성공적으로 실행되면, 그 이후의 코드는 부모와 자식 프로세스 각각에서 한 번씩 실행되므로 printf 문이 총 두 번 호출되는 것입니다.