Fork 함수

Denia·2022년 12월 25일
0

크래프톤 정글 1기

목록 보기
13/15

Fork 함수

CSAPP : 712page

  1. 한번 호출하고 두 번 리턴
    1. fork함수는 부모에 의해서 한번 호출되지만 리턴은 두번한다. 한번은 부모, 다른 한번은 새로만든 자식 ⇒ 이것은 한 개의 자식을 만드는 프로그램들에 대해서는 매우 명확하다.
      그러나 여러 개의 fork를 갖는 프로그램은 헷갈릴 수 있으며 주의 깊게 생각해야할 필요가 있다.
  2. 동시 실행
    1. 부모와 자식은 동시에 돌아가는 별도의 프로세스들이다.
    2. 이들의 논리적 제어흐름 내의 인스트럭션들은 커널에 의해서 임의의 순서로 중첩될 수 있다.
    3. 일반적으로 프로그래머로서 우리는 서로 다른 프로세스내에서 인스트럭션들 간의 중첩 실행에 관해서 절대로 가정할 수 없다.
  3. 중복된, 그러나 별도의 주소공간
    1. 만일 부모와 자식을 각 프로세스에서 fork함수가 리턴한 직후에 중단할 수 있다면, 각 프로세스의 주소공간이 동일하다는 것을 알 수 있을 것이다.
    2. 각 프로세스는 동일한 사용자 스택, 지역변수 값들, 힙, 전역변수 값, 동일한 코드를 가진다.
  4. 공유된 파일
    1. 예제 프로그램을 실행할 때, 부모와 자식 모두가 자신의 출력을 화면을 통해서 한다는 것을 알 수있다. ⇒ 그 이유는 자식이 부모가 오픈한 모든 파일들을 상속받았기 때문
    2. 부모가 fork를 호출할 때 stdout 파일은 열려 있으며, 화면으로 재지정되어 있다.
    3. 자식은 이 파일을 상속하였으며, 그래서 자신의 출력도 화면으로 가게 된다.

예제 코드 - fork를 사용해서 새로운 프로세스 만들기

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

pid_t fork(void);

void unix_error(char *msg){ //Unix style error message
    fprintf(stderr, "Error: %s\n", msg);
    exit(0);
}

pid_t Fork(void){
    pid_t pid;

    if((pid = fork()) < 0)
        unix_error("Fork error");
    return pid;
}

int main(){
    pid_t pid;
    int x = 1;

    printf("Fork_test Start \n\n");

    pid = Fork();

    // child
    if(pid == 0){ 
        printf("child : x=%d\n\n", ++x);
        exit(0);
    }

    //parent
    printf("parent : x=%d\n\n", --x);
    printf("child PID : pid=%d\n\n", pid);
    exit(0);
}

결과 값 출력

parent : x = 0
child : x = 2

profile
HW -> FW -> Web

0개의 댓글