Linux/Linux_programing

System - 04. fork 복제 프로세스 생성

sosal 2009. 10. 28. 16:28
반응형

/*
 http://sosal.tistory.com/
 * made by so_Sal
 */



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

pid_t fork(void);

fork함수를 사용하면 multi - tasking system을 볼 수 있습니다.
부모프로세스가 fork함수를 호출하면 자식프로세스를 생성합니다.
파일 이름이 fork이고, fork 함수를 실행시키는 파일을 실행해보고, pstree를 통해서
현재 자신의 쉘에 띄워진 프로세스들을 봅시다.



fork 라는 파일의 프로세스 아래에 자신과 똑같은 이름의 프로세스가 하나 더 생겼네요.
여기서 마지막 fork 프로세스를 실행시킨 첫번째 fork 프로세스를 부모프로세스,
새로 생긴 마지막 fork라는 프로세스는 자식 프로세스라고 합니다.

fork함수로 실행된 각각의 부모, 자식 프로세스는 cpu의 제어권을 잃지 않고
서로 동시에 실행됩니다.

그렇다면, fork함수를 여러번 호출하는 프로그램을 봅니다.















음.. 좀 지저분 하군요..
fork (포크.) 자식프로세스를 생성하다보면 포크 모양처럼 프로세스의 트리 구조가 생성되기 때문에
함수의 이름이 fork 입니다. ㅎㅎ

이제 fork 함수에 대해 더 가까이 가볼까요?
소스를 한번 봅시다.

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

int main(){
    pid_t pid; //포크함수 리턴값을 받을 변수
    char *massage;
    printf("fork program starting\n");

    pid = fork(); //포크함수 실행!! 이 자리에서 프로세스가 2개가 되었습니다!!

    switch(pid){ //리턴되는 pid를 통해서 각각의 프로세스의 행동을 구현합니다.
        case -1:   // fork() 에러
            perror("Fork failed");
            exit(1);
        case 0:     //0이면 자식프로세스입니다. 중요합니다.
            massage = "This is the child";
            break;
        default:     //그 외에 양수는 부모 프로세스입니다.
            massage = "This is the parent";
            break;
    }

sleep(5);
exit(0);
}

한번 구현을 해보시면 쉽게 이해하실 수 있습니다.
위 소스는 switch를 통하여 자식프로세스, 부모프로세스의 역할을 구현해줬지만
보통은 if절을 통하여 pid==0 , pid>0 이렇게 나누어 자식과 부모의 역할을 구현해 줍니다.

새로운 프로세스를 생성하면, 그 프로세스의 맨 윗부분 #include 전처리 부분부터 시작하는 것이 아니라,
fork함수가 호출된 그 소스의 위치에서부터 시작하게 됩니다. (메인 스레드가 fork 에서부터 시작)

이렇게 한 프로그램 안에서 자식과 부모의 모든 역할을 정해준다면,
같은 프로세스 2개에 같은 소스가 들어있고, 부모가 할일, 자식이 할일 따로 주어져있다면,
부모 프로세스에서 구현된 "자식프로세스가 할일"에 대한 소스는, 낭비이고,
반대로 자식 프로세스에 구현된 "부모프로세스가 할일"에 대한 소스 역시 낭비입니다.
그래서 fork함수와 exec계열 함수를 같이 사용합니다.

fork함수를 통하여 자식프로세스를 생성한 후,
자식프로세스는 exec 계열 함수를 통하여 내가 원하는 다른 프로세스로 바꾸고,
부모 프로세스는 그 아래에 계속 할일을 구현해 준다면
그야 말로 멀티테스킹, 동시에 여러 여러 프로세스(task)를 실행시켜
한번에 다양한 일을 os가 할 수 있도록 구현이 가능하겠죠!!

System 게시물들은
begining Linux programing.
유닉스 프로그래밍
Linux 언쉬리드' 를 참고하였습니다.