티스토리 뷰

fork() 함수를 이해하는데 상당히 오랜시간이 걸렸습니다.

위키피디아에 설명이 되어있고, 예제 코드도 존재합니다.

  http://en.wikipedia.org/wiki/Fork_(operating_system)


제가 만든 예제는 fork()를 이용하여 부모 프로스세 1개에 자식프로세스 5개를 생성하는 코드입니다.


간단한 fork예제 (wiki 참고)

그전에 fork의 기본 예제부터 살펴보겠습니다. wiki에 올라와 있고, 이미 많은 곧에서 배포되는 간단한 코드입니다.

 아래와 같이 부모와 자식이 각각 구동되고 있습니다. 각각 0에서 9까지 출력하는 프로그램입니다.


실행중인 프로세스 확인

 ps명령어로 실행되는 프로세스를 확인 할 수 있습니다.


예제 코드

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

int main(void)
{
	pid_t pid; //pid_t 선언

	pid = fork(); //fork 발생
	if(pid == -1) { //-1 이면 fork생성 에러
		printf("can't fork, erro\n");
		exit(0);
	}

	if(pid == 0) { //0이면 자식 프로세스
		int j;
		for(j = 0; j < 10; j++) {
			printf("child: %d\n", j);
			sleep(1);
		}
		exit(0);
	} else { //부모프로세스
		int i;
		for(i = 0; i < 10; i++) {
			printf("parent : %d\n", i);
			sleep(1);
		}
		exit(0);
	}
	return 0;
}


1개의 부모 프로세스와 5개의 자식 프로세스가 구동되는 프로그램 예제

 위에서 작성한 기본 예제 코드를 이용하여, 1개의 부모와 5개의 자식프로세스가 독립 프로세스로 돌아가는 코드를 작성하겠습니다. 아래 실행 화면에서 처럼 부모 pid 값이 1885이고, 자식의 pid 값이 1887~1891 까지의 자식 프로세스가 실행되는 걸 확인 할 수 있습니다.

 slepp(10) 을 주어 10초 후에 각각 종료되는 예제 코드로 작성하였기에 아래와 같이 10초간 동작하는 프로세스를 확인할 수 있습니다.

예제 소스코드

#include <stdio.h>
#include <stdlib.h>

#define TOTALFORK 5 //총 생성해야할 프로세스 수

int main(int argc, char **argv) {
	pid_t pids[TOTALFORK], pid;
	int runProcess = 0; //생성한 프로세스 수
	int state;

	while(runProcess < TOTALFORK) { //5개의 프로세스를 loop 를 이용하여 생성
        //자식 프로세스 종료 대기 (각 프로세스가 따로 동작하고, 
        //종료를 기다려야 할 경우에 사용
		//pid = wait(&state); 
		pids[runProcess] = fork();//fork 생성
        //0보다 작을 경우 에러 (-1)
		if(pids[runProcess] < 0) {
			return -1;
		} else if(pids[runProcess] == 0) {//자식 프로세스
			printf("child  %ld\n", (long)getpid());
			//for(;;) {}
			sleep(10);
			exit(0);
		} else { //부모 프로세스
			printf("parent %ld, child %ld\n", (long)getpid(), (long)pids[runProcess]);
		}
		runProcess++;
	}
	return 0;
}





댓글