FORK(2)

명칭
fork - 새로운 프로세스를 작성한다

프로그램 라이브러리
libc

서식
<sys/types.h> <unistd.h> pid_t fork(void)

해설
fork() 에 의해 새로운 프로세스의 작성을 합니다. 새로운 프로세스 (child process)는, 이하의 항목을 제외한 호출 프로세스 (parent process)의 정확한 카피입니다.

•   child process는 독특한 프로세스 ID 를 가집니다.

•   child process는 다른 parent process ID 를 가집니다 (즉, parent process의 프로세스 ID 입니다).

•   child process는, 전용의, 부모의 기술자의 카피를 가집니다. 그러한 기술자는 하층의 같은 오브젝트를 참조합니다. 즉 아이와 부모의 사이로, 예를 들어 파일 오브젝트내의 파일 포인터가 공유됩니다. 그 때문에 child process의 기술자에게로의 lseek(2) 하지만, 그 후의 부모에 의한다 read(2) 또는 write(2) 에 영향을 미칩니다. 이 기술자 카피는, 새롭게 작성된 프로세스용의 표준 입출력을 확립하기 위해서, 및 파이프를 셋업 하기 위해서, 쉘에 의해도 사용됩니다.

•   child process의 리소스 사용 상황은 0 으로 설정됩니다. setrlimit(2) (을)를 참조해 주세요.

•   모든 인터벌 타이머가 클리어 됩니다. setitimer(2) (을)를 참조해 주세요.

반환값
정상적으로 완료했을 경우, fork() (은)는, child process에 값 0 을 돌려주어, child process의 프로세스 ID 를 parent process에 돌려줍니다. 그렇지 않은 경우는 -1 이 parent process에 돌려주어져 child process는 작성되지 않고 , 에러를 나타내기 위해서(때문에) 글로벌 변수 errno 하지만 설정됩니다.

에러
다음의 경우에 fork() (은)는 처리에 실패해, child process는 작성되지 않습니다.

[EAGAIN]
    실행중의 프로세스의 합계수가 시스템의 한계를 넘습니다. 한계치는 sysctl(3) 의 MIB 변수의 KERN_MAXPROC 에 의해 지정됩니다 (슈퍼 유저를 제외해, 실제로는 한계는 이것보다 10 개 적게 됩니다).

[EAGAIN]
    유저가 슈퍼 유저가 아니고, 1 명의 유저에 의해 실행중의 프로세스의 합계수에 시스템이 부과한다 한계를 넘습니다. 한계는 sysctl(3) 의 MIB 변수의 KERN_MAXPROCPERUID 에 의해 지정됩니다.

[EAGAIN]
    유저가 슈퍼 유저가 아니고, 리소스 파라미터의 RLIMIT_NPROC 에 대응하는 소프트 리소스 한계를 넘습니다. (getrlimit(2) (을)를 참조).

[ENOMEM]
    새로운 프로세스용의 스왑 공간이 불충분합니다.

관련 항목
execve(2), rfork(2), setitimer(2), setrlimit(2), vfork(2), wait(2)

역사
fork() 함수는 AT&T UNIX 그리고 등장했습니다.