1. 프로세스 생성 (fork() 함수)
System Program/process 2014. 2. 24. 11:441. fork() 함수
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); }