개요
이번 글에서는 C++에서 fork() 시스템 콜을 사용하여 자식 프로세스를 생성하는 방법과, 각 프로세스에서 서로 다른 연산을 수행하는 예제를 살펴보겠습니다. 부모 프로세스에서는 배열에 포함된 모든 짝수의 합을 구하고, 자식 프로세스에서는 배열 요소 중 홀수의 합을 계산합니다.
fork()의 동작 원리
fork()는 호출 시점의 프로세스를 복제하여 새로운 자식 프로세스를 만드는 POSIX 시스템 콜입니다. Linux/Unix 환경에서 <unistd.h> 헤더에 선언되어 있으며, 호출 이후에는 부모와 자식 두 프로세스가 각각 실행됩니다. 프로그램 내부에서는 fork()의 반환값을 통해 자신이 어느 쪽 프로세스인지 판단할 수 있습니다.
- 반환값이 0보다 크면 → 현재 코드는 부모 프로세스에서 실행 중이며, 반환값은 생성된 자식 프로세스의 PID입니다.
- 반환값이 0이면 → 현재 코드는 자식 프로세스에서 실행 중입니다.
- 반환값이 -1이면 → 프로세스 생성이 실패한 경우입니다.
즉, 하나의 코드 분기문으로 두 프로세스를 구분하고 서로 다른 작업을 할당할 수 있습니다.
예제 코드
#include <iostream>
#include <unistd.h>
using namespace std;
int main() {
int a[15] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12, 13, 14, 15};
int odd_sum = 0, even_sum = 0, n, i;
n = fork(); //프로세스 분할
if (n > 0) { //n이 0이 아니면 부모 프로세스
for (int i : a) {
if (i % 2 == 0)
even_sum = even_sum + i;
}
cout << "Parent process " << endl;
cout << "Sum of even numbers: " << even_sum << endl;
} else { //n이 0이면 자식 프로세스
for (int i : a) {
if (i % 2 != 0)
odd_sum = odd_sum + i;
}
cout << "Child process " <<endl;
cout << "Sum of odd numbers: " << odd_sum << endl;
}
return 0;
}
실행 결과
Parent process Sum of even numbers: 56 Child process Sum of odd numbers: 64
코드 해설
배열에는 1부터 15까지의 정수가 담겨 있습니다. fork() 호출 이후 부모 프로세스는 범위 기반 for 문으로 배열을 순회하며 짝수(2+4+6+8+10+12+14 = 56)의 합을 계산하고, 자식 프로세스는 같은 배열에서 홀수(1+3+5+7+9+11+13+15 = 64)의 합을 계산하여 출력합니다.
한 가지 주의할 점은 fork() 이후 부모와 자식 프로세스의 실행 순서가 운영체제 스케줄러에 의해 결정된다는 것입니다. 따라서 실행 환경에 따라 출력 순서가 바뀌거나 두 프로세스의 출력이 섞여 보일 수 있습니다. 이는 정상적인 동작이며, 순서를 보장해야 하는 경우 wait() 등의 동기화 기법을 추가로 사용해야 합니다.