본문으로 바로가기
homeimage
  1. Home
  2. 컴퓨터/프로그래밍
  3. C언어 프로세스 생성 함수 fork()

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

· 댓글개 · 바다야크

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);
    }
  }
}

C언어 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);
      }
   }
}

C언어 fork() 예제 실행 결과

]$ ./a.out
작식 프로세스 생성 시작
저는 부모 프로세스로 카운트하겠습니다.
자식 프로세스의 pid는 3733입니다.
부모: 0
저는 자식 프로세스로 디스카운트하겠습니다.
자식: 0
부모: 1
자식: -1
부모: 2
자식: -2
부모: 3
자식: -3
부모: 4
자식: -4
부모: 5
자식: -5
부모: 6
자식: -6
^C
]$
SNS 공유하기
💬 댓글 개
최근글
이모티콘창 닫기
울음
안녕
감사해요
당황
피폐

이모티콘을 클릭하면 댓글창에 입력됩니다.