Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

시다바리

[C 언어] fork() 본문

Language/C

[C 언어] fork()

호서아빠 2008. 8. 8. 10:57

  출처 : http://cafe.daum.net/ITdreamHACKER/4J9G/25

1.1.1 fork() 함수는 어떤 일을 하는가?

#include <sys/types.h>
#include <unistd.h>

pid_t fork(void);

 `fork()' 함수는 존제하는 프로세스가 새로운 프로세스를 생성하고자 할때 사용된다. 이때 새로 생성되는 프로세스를 자식 프로세스라고 부르고, 신규 프로세스를 생성하는 프로세스를 부모 프로세스라고 부른다. 또한 프로세스 생성이 성공적으로 이루어지면 부모 프로세스쪽으로는 자식 프로세스의 Process ID가 넘어오고, 자식 프로세스로는 0이 넘어온다. 이 간단한 코드가 이 기본원리를 설명한다

pid_t pid;

switch (pid = fork()) {
  case -1:
    /* 여기서 pid는 -1이고, fork는 실패한 것이다. */
    /* 보통은 가상 메모리 부족등의 이유다.        */
    perror("The fork failed!");
  break;

  case 0:
    /* pid가 0이면 자식 프로세스를 뜻한다. */
    /* 여기서 프로그램은 자식 프로세스다.  */
    /* 이 후에 우리는 다음과 같은것을 실행한다: */
    _exit(0);

  default:
    /* pid가 0보다 크면 부모 프로세스이다. */
    printf("Child's pid is %d\n",pid);
}

물론 switch문 대신에 if문을 쓸 수도 있다. 그러나 위의 형태가 좀더 유용하다.

자식 프로세스는 부모 프로세스로부터 다음을 상속받는다
* 프로세스 credentials (real/effective/saved UIDs and GIDs)
* environment
* 스택
* 메모리
* 파일 디스크립터(이 때문에 부 프로세스와 자식 프로세스간의 혼란이 생길 수 있다.)
* close-on-exec flags
* signal 핸들링 셋팅
* nice 값
* 스케줄 class
* 프로세스 그룹 ID
* 세션 ID
* 현재 working 디렉토리
* 루트 디렉토리
* 파일 모드와 umask설정
* 리소스 제한
* 터미널 제어

자식 프로세스에만 유일한것
* 프로세스 ID
* 부모 프로세스 ID
* 파일 디스크립터와 디렉토리 스트림.
* 프로세스, 텍스트(text), 데이타와 다른 상속받지 않은 메모리 락(lock)들.
* tms 스트럭쳐에서의 프로세스 시간
* 리소스 이용 현황은 0으로 셋팅된다
* pending signal은 빈(empty) 것으로 셋팅된다.
* timer_create에 의해 생성된 timer
* 상속받지 않은 비동기 입출력 오퍼레이션

Comments