본문 바로가기
개발/C, C++

[C] fork 함수란? | fork() function in c | 리눅스

by candosh 2024. 12. 18.

 

들어가기 전에 글을 읽기 귀찮다면 아래 유튜브를 봐도 좋을 것 같다!

 

fork함수 자체만 다루는 한국 영상이 없는 거 같아서 봤는데, 영어 잘 들리고 쉽게 설명해 주신다 ^^ 굿.

https://www.youtube.com/watch?v=cex9XrZCU14 


🍴 fork() 함수란?

fork함수에 대해 궁금하게 된 경로는 C를 공부하다가 또는 리눅스시스템에 대해 공부하다가 일 수 있을 것 같다.

 

fork함수 자체는유닉스 계열 운영체제에서 사용하는 시스템 호출로, 프로세스를 생성하는 데 사용하는 함수이다.

 

fork를 호출하면 현재 프로세스(부모 프로세스)가 복사되어 새로운 프로세스(자식 프로세스)가 생성된다.

 

🧑‍🧒 부모 프로세스 복사?

fork는 부모 프로세스를 복제하여 자식 프로세스를 만드는 것이다. 그래서 부모와 자식 프로세스는 동일한 코드, 데이터, 파일 디스크립터 등을 갖지만, 각각의 독립적인 메모리 공간을 사용한다.

 

🔄 반환 값?

 

  • 부모 프로세스에서 fork 호출 -> 자식 프로세스의 PID(프로세스 ID)를 반환
  • 자식 프로세스에서 fork 호출 -> 0을 반환
  • 에러가 발생 -> -1을 반환, 이 경우 자식 프로세스는 생성 X

 

 🤲🏻병렬 실행?

 

  • fork 이후 부모와 자식 프로세스는 동시에 실행
  • 둘 다 fork 다음 코드부터 실행을 이어가지만, 각자의 주소 공간에서 독립적으로 실행

 

위의 내용은 일단 개념적인 내용이고 예시를 보면 될 것 같다.

🤖 예시

일단 C에서 fork함수를 쓰려면 #include <unistd.h> 헤더를 사용해야 한다.

 

[ 쉬운 예제 ]

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

int main() {
    fork();
    printf("Hello, World!\n");
    return 0;
}

 

출력

Hello, World!
Hello, World!

 

 

  • 부모 프로세스와 자식 프로세스는 동일한 코드에서 printf를 실행
  • fork() 이후 두 프로세스가 독립적으로 실행되므로, 출력이 두 번 나타나게 된다.

[ 더 고민해 보면 좋을 예제 ]

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

int main() {
    printf("A");
    fork();
    printf("B");
    fork();
    printf("C\n");
    return 0;
}

 

출력 값은?

더보기

ABC
ABBC
ABCB
ABCC

출력 구조:

  1. 처음 printf("A")는 fork() 이전에 실행되므로 모든 프로세스에서 A가 출력
  2. 첫 번째 fork() 이후 printf("B")가 실행. 이제 프로세스는 두 개
  3. 두 번째 fork() 이후 printf("C\n")가 실행. 최종적으로 프로세스가 4개

-> 위 출력 결과는 운영체제의 스케줄러에 따라 달라질 수 있다

⭐️ 주의

fork를 반복 호출하여 무수히 많은 프로세스를 생성하면 시스템이 멈출 수 있다. 또한 자식 프로세스가 종료되지 않고 계속 남아 있으면 좀비 프로세스가 될 수 있으니 주의하자!