C언어 프로세스 생성 함수 fork()

2020. 3. 15. 12:16 컴퓨터/프로그래밍

C함수 프로세스 생성 fork()

fork()는 현재 실행되는 프로세스에 대해 복사본 프로세스를 생성합니다.

  • 헤더: unistd.h
  • 형태: pid_t fork(void)
  • 인수: -
  • 반환: pid_t -1 : 실패
    0 == 자식 프로세스, 새로 생성된 프로세스임
    0 < 생성된 자식 프로세스 PID

Microsoft Windows 프로그래밍만 해 왔던 저로서는 참 신기하면서도 마음에 드는 함수였습니다. 물론 Microsoft Windows 프로그램은 GUI가 대부분이므로 fork()로 프로세스를 새로 만들기에는 무리가 있습니다만, 실행 중에 독립된 작업이 가능하다면 프로세스를 별개로 나누어 실행하는 것이 여러 모로 편리하고, 프로그램 작성에도 작업에 따라 집중할 수 있어 좋습니다.

fork()함수는 마치 마술과 같은 함수여서 하나의 프로그램을 fork()함수를 만나는 순간 복제본이 생성됩니다. 프로세스란 디스크에 있던 프로그램 파일이 메모리에 올려지고 시스템의 스케줄에 따라 실행이 되는 실행 단위가 되겠습니다. 아래의 프로그램을 보면 fork()를 실행하고 그 결과값을 확인하고 있습니다.

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

int main()
{
   int   counter  = 0;
   pid_t pid;

   printf( "작식 프로세스 생성\n");
   pid   = fork();

   switch( pid)
   {
   case -1  :
      printf( "자식 프로세스 생성 실패\n");
      return -1;
   case 0   :
      printf( "저는 자식 프로세스로 디스카운트하겠습니다.\n");
      while( 1 ){
         printf( "자식: %d\n", counter--);
         sleep( 1);
      }
   default  :
      printf( "저는 부모 프로세스로 카운트하겠습니다.\n");
      printf( "자식 프로세스의 pid는 %d입니다.\n", pid);
      while( 1 ){
         printf( "부모: %d\n", counter++);
         sleep( 1);
      }
   }
}

이해를 돕기 위에 실행 순서로 본다면 아래와 같습니다.

원래 실행되었던 부모 프로세스 fork()로 생성된 자식 프로세스
int main()
{
  int   counter  = 0;
  pid_t pid;

  printf( "작식 프로세스 생성");
  pid   = fork(); ---> 자식 프로세서 생성
  ---> pid 값은 자식 프로세스의 pid 값

  switch( pid){
  case -1  :
    printf( "자식 프로세스 생성 실패\n");
    return -1;
  case 0   :
    printf( "저는 자식 프로세스....\n");
    while( 1 ){
      printf( "자식: %d\n", counter--);
      sleep( 1);
    }
  default  :
    printf( "저는 부모 프로세스로..");
    printf( "자식 프로세스의 pid는..", pid);
    while( 1 ){
      printf( "부모: %d\n", counter++);
      sleep( 1);
    }
  }
}
int main()
{
  int   counter  = 0;
  pid_t pid;

---> 부모와 똑 같은 프로세스가 그대로 복사되므로
---> 전역 변수 값에서 로컬 변수 값까지 모두 복사되며,
---> pid 값만 0 값을 갖습니다.

  switch( pid){
  case -1  :
    printf( "자식 프로세스 생성 실패\n");
    return -1;
  case 0   :
    printf( "저는 자식 프로세스로....\n");
    while( 1 ){
      printf( "자식: %d\n", counter--);
      sleep( 1);
    }
  default  :
    printf( "저는 부모 프로세스로...\n");
    printf( "자식 프로세스의 pid는...", pid);
    while( 1 ){
      printf( "부모: %d\n", counter++);
      sleep( 1);
    }
  }
}

예제

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

int main()
{
   int   counter  = 0;
   pid_t pid;

   printf( "작식 프로세스 생성 시작\n");
   pid   = fork();

   switch( pid)
   {
   case -1  :
      printf( "자식 프로세스 생성 실패\n");
      return -1;
   case 0   :
      printf( "저는 자식 프로세스로 디스카운트하겠습니다.\n");
      while( 1 ){
         printf( "자식: %d\n", counter--);
         sleep( 1);
      }
   default  :
      printf( "저는 부모 프로세스로 카운트하겠습니다.\n");
      printf( "자식 프로세스의 pid는 %d입니다.\n", pid);
      while( 1 ){
         printf( "부모: %d\n", counter++);
         sleep( 1);
      }
   }
}

실행 결과

]$ ./a.out
작식 프로세스 생성 시작
저는 부모 프로세스로 카운트하겠습니다.
자식 프로세스의 pid는 3733입니다.
부모: 0
저는 자식 프로세스로 디스카운트하겠습니다.
자식: 0
부모: 1
자식: -1
부모: 2
자식: -2
부모: 3
자식: -3
부모: 4
자식: -4
부모: 5
자식: -5
부모: 6
자식: -6
^C
]$
이 댓글을 비밀 댓글로
  1. 잘보고 갑니다 즐거운 점심시간 이네요 ㅋ
  2. 식사 맛있게 하셨나요? 방문해 주셔서 감사합니다. ^^