1. 프로세스 생성 (fork() 함수)

System Program/process 2014. 2. 24. 11:44

1. fork() 함수

 

#include <unistd.h>

pid_t fork(void);

                             부모프로세스에서 호출 성공 시 : 생성된 자식프로세스의 PID를 리턴, 에러 발생 시 '-1'을 리턴

                                                               새로 생성된 자식 프로세스에서 호출 시 : '0'을 리턴  

 

부모 프로세스와 거의 동일한 복제된 프로세스를 생성한다.

자식프로세스는 부모의 스택, 테이터, 힙, 텍스트 세그먼트를 복제한다.

 

 

2. fork() 함수 사용 시 유의 사항

 

1) 열린 파일 디스크립터가 부모 프로세스와 동일한 값으로 복제된다.

    fork()함수 복제 후 파일 처리 시에 주의를 기울여야 하며, close(fp)/dup() 함수를 사용하여 문제가 없도록 하여야 한다.

 

2) fork() 함수 복제 후, 부모와 자식간에 경쟁 상태 진입 시 제어가 필요할 경우는 각가지 동기화 기법을 통해서

   문제가 없도록 하여야 한다.

 

3) 자식 프로세스 실행 시점은 fork() 함수가 성공적으로 리턴 후부터이다.  

 

3. 예제

 

간단히 fork() 함수의 사용 예 정도로 예제를 마무리 한다.

 

/*
* main.c -- C Test App.
*
* Copyright (C) 2012-2013, 2013 heesoon.kim <chipmaker.tistory.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>

int main(int argc, char *argv[])
{
	pid_t pid, wpid;
	int status;
	
	pid = fork();

	switch(pid)
	{
		case -1: 
			_exit(EXIT_FAILURE);
			
		case 0 : // child process
			printf("child process call fork() fucntion \n");
			_exit(EXIT_SUCCESS);

		default: // parent process
			wait(&status);
			printf("child process exit status = %d \n", WEXITSTATUS(status));
			break;
	}
	
	exit(EXIT_SUCCESS);
}


 

 

 

 

: