자식 프로세스 3개 생성 - jasig peuloseseu 3gae saengseong

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 ]$

글쓴이: seongwon1 / 작성시간: 월, 2003/11/24 - 1:45오전

안녕하세요?

동시에 여러개의 child_process를 만들려고 합니다.

그래서 코드를

int i int pid[3] for(i = 0; i< 3; i++) pid[i] = fork();

이런식으로 사용을 해보려고 하는데요.

fork()를 통해 만들어진 각 프로세스의 아이디가 이 같은 경우엔 어떻게

되는 건가요? 그리고 각 프로세스를 제어하려면 어떤식으로 만들어야

되는지 참 막막하네요. 차일드 프로세스를 하나만 만들 경우에는 그냥 switch문

을 사용하면 되겠지만 이건 그렇게는 도저히 안될 것 같고

if문을 사용하자니 잘 모르겠고 말이죠.

특히 프로세스 대기 부분을 어떤식으로 구현해야 할지 정말 막막합니다.

프로세스 대기 부분을 세마포어로 만들면 될까요?

여러 고수님들의 도움 부탁드립니다.

좋은 하루 보내세요.[/code]

  • 댓글 달기

Toplist

최신 우편물

태그