Study/C언어

[C] fork 함수

욘아리 2024. 7. 8. 23:22

정처기 실기 프로그래밍 문제를 풀다가 C언어에서 fork함수가 나왔을 때 어렵다고 생각했는데, 아니나 다를까 흥달쌤의 최신 유튜브 강의에 Q&A에 답변해 주신 게 있었다.

 

개발에선 어렵고 복잡한 게 맞지만 정처기 문제를 풀 땐 단순하게 생각해서 풀면 된다고 한다.

(다들 나랑 똑같은 생각을 했나 보다 ㅎㅎ) 

 

fork() 함수

'fork'는 프로세스를 생성하는 시스템 호출로, 새로운 자식 프로세스를 만들고, 부모 프로세스와 자식 프로세스 모두에서 반환된다.

 

✔️ 일단 fork 함수를 수행하면 세 가지 리턴값이 나올 수 있다.

  1. 부모 프로세스에서의 리턴값 : 양수
  2. 자식 프로세스에서의 리턴값 : 0
  3. 오류가 발생했을 때의 반환값 : 음수 => 시험에 나올 일 없다.

✔️ 찬물도 위아래가 있다 부모부터 수행하면 된다.

✔️ fork함수를 만났을 때 그냥 두 번 수행한다고 알아주면 된다.

 

위의 내용들을 참고해서 예제들을 풀어보자. 

 

예제 1. C언어 프로그램의 출력 결과는? (단, 자식 프로세스의 생성을 성공하였다고 가정)

#include <stdio.h>
#include <unistd.h>

int main(void) {
    int x = 0;
    fork();
    x = 1;
    printf("%d\n", x);
    
    return 0;
}
1
1
  • fork() 호출 이후 코드가 두 번 실행되는데, 'x = 1'로 설정된 후 printf가 호출되므로, 두 프로세스 모두 '1'을 출력한다.

 

예제 2. C언어 프로그램의 출력 결과는? (단, "pid = fork();" 문장의 수행 결과 자식 프로세스의 생성을 성공하였다고 가정)

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main(void) {
    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);
    }
    return 0;
}
b = 120, a = 6
  • 부모 프로세스가 먼저 수행되어야 하지만 wait(NULL)이 있어서 자식 프로세스가 종료될 때까지 기다린다.
  • 즉, 이 문제에서는 자식 프로세스가 먼저 실행되고 종료된 후 부모 프로세스가 실행된다.

 

✨👩‍💻 ✨

아직은 fork 함수가 낯설지만 쌤이 알려주신 것만 잘 생각하면 문제는 풀 수 있을 것 같다. (풀어야 함!!!)

 

 

 

출처

흥달쌤 youtube