Skip to main content

[C언어] fork 함수


다음은 리눅스 환경에서 fork() 시스템 호출을 이용하여 자식 프로세스를 생성하는 C 프로그램이다. 출력 결과로 옳은 것은?

(단, "pid = fork();" 문장의 수행 결과 자식 프로세서의 생성을 성공하였다고 가정한다.

int i = 0, v = 1, n = 5;
pid_t pid;
pid = fork();

if (pid < 0) {
	for (i \ 0; i < n; i++) v += (i + 1);
	printf("c = %d", v);
}
else if (pid == 0) {
	for (i = 0; i < n; i++) v *= (i + 1);
	printf("B = %d", v);
} 
else {
	wait(NULL);
	for(i = 0; i < n; i++) v += 1;
	printf("a = %d", v);
}


fork()란?

  • fork()는 리눅스/유닉스 시스템에서 현재 실행 중인 프로세스(부모)를 복제(copy)해서 새로운 프로세스(자식)를 만드는 시스템 호출이다.
  • 새로 생성된 자식 프로세스는 부모와 거의 동일한 메모리 상태로 시작하지만, 별개의 독립된 프로세스이다.

반환값

의미

음수 (예: -1)

fork 실패 (자식프로세스 생성 불가)

0

자식 프로세스에서 반환되는 값

양수 (예:1234)

부모 프로세스에서 반환되며, 자식 프로세스의 PID를 의미

pid 리턴값은 성공하면 0보다 크다.

순서만 정확하게 알면 문제를 쉽게 풀 수 있다. 원칙적으로는 부모 프로세스 먼저 출력하고, 자식 프로세스를 출력한다. 이 때 부모 프로세스의 반환값인지는 pid 값이 > 0 인 걸 보고 알 수 있다. 이 부분이 먼저 수행된다. 하지만 이 코드에서는 부모 프로세스가 `wait(NULL)`을 호출하므로, 자식 프로세스가 종료될 때까지 부모는 대기하게 된다.

따라서 실제 실행 순서는 다음과 같다:

  1. 자식 프로세스가 먼저 실행되어 `for`문을 통해 연산을 수행하고 출력한다.
  2. 자식 프로세스가 종료된 뒤,
  3. 부모 프로세스가 `wait()`에서 해제되어 이어서 `for`문과 `printf`를 수행한다.

결론적으로, 이 문제에서는 **자식 프로세스의 출력이 먼저**, **부모 프로세스의 출력이 나중에 발생**한다.