fork(2)

#include <unistd.h>

pid_t fork(void);

현재 실행중인 프로세스와 동일한 기능을 하는 새로운 프로세스를 생성합니다.

 

새로운 프로세스를 자식프로세스라고 하고 기존의 프로세스를 부모프로세스라고 합니다.

부모 프로세스와 자식 프로세스는 아래의 내용이외에는 거의 동일합니다.

 

부모 프로세스와 자식 프로세스의 차이

    - 프로세스ID가 서로 다르며, 부모 프로세스ID도 다릅니다.
    - 자식프로세스의 PPID(getppid(2))는 부모프로세스의 PID(getpid(2)) 같습니다.
    - 자식프로세스에서 리소스 통계는 0으로 초기화됩니다.
    - 시그널 설정은 상속되지 않습니다.
    - open된 파일은 유지되지만, file lock은 자식 프로세스에서는 해제됩니다.

 

UNIX / LINUX에서는 프로세스 생성과 실행할 binary 교체는 분리되어 있습니다.

A라는 프로그램에서 B라는 프로그램을 실행하기 위해서는 fork(2) + exec계열함수를 연속으로 호출하여 실행해야 합니다.

fork(2)는 자신과 같은 프로세스(A프로그램)를 생성하고, exec( )계열함수는 프로세스의 내용을 B프로그램으로 교체합니다.

 

파라미터

없음

 

RETURN

양수
    - fork()에서 1 이상을 return 받은 프로세스는 부모 프로세스이며, return값은 자식프로세스ID입니다.
      즉, 부모는 방금 생성한 자식 프로세스 ID를 알 필요가 있기때문에 return 받습니다.
      차일드 프로세스의 종료를 대기하거나 SIGCHLD에 대한 signal 처리를 위해서 필요합니다.
      또한 자식 프로세스ID는 여러개가 있을 수 있기 때문에 자식프로세스ID를 얻는 함수가 없습니다.


0
    - fork()에서 0을 return 받은 프로세스는 차일드 프로세스 자신입니다.
      부모 프로세스 ID는 getppid(2)를 통해서 얻을 수 있기 때문에 0을 return받습니다.


-1
    - 오류가 발생하여 자식 프로세스가 생성되지 않았습니다.  상세 오류내용은 errno에 설정됩니다.

 EAGAIN : 최대 프로세스 갯수 제약(RLIMIT_NPROC)에 도달하여 프로세스 생성에 실패함.
 ENOMEM : 메모리 부족으로 프로세스 생성에 실패함
 ENOSYS : 이 시스템은 메모리관리 unit이 없어서 fork를 지원하지 않음.

 


활용 예제

 

Sample

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

......

pid_t pid;

/* 여기는 하나의 프로세스만 있습니다. */
pid = fork();

/* 여기는 두개의 프로세스가 되었습니다. (pid가 -1이 아니라면) */
if(pid > 0) {
    printf("I am a prarent process. child process id: %d\n", pid);
} else if(pid == 0) {
    printf("I am a child process.")
} else {
    fprintf(stderr, "fork() error: %s\n", strerror(errno));
}

......

 


see also: Process 관리 함수 

 

 

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요