RFORK(2)

명칭
rfork - 프로세스 리소스의 조작

프로그램 라이브러리
libc

서식
<unistd.h> int rfork(int flags)

해설
fork, vfork, rfork 는, 새로운 프로세스가 작성되는 유일한 방법입니다. rfork() 에의 인수 flags (은)는, 기동하고 있는 프로세스 (친) 목의 리소스가 새로운 프로세스 (아이)에 따라서 공유되는지, 또는 그러한 기본값에 초기화되는지를 선택합니다. 리소스에는 오픈 파일 기술자 테이블 (이것은, 공유되는 경우, 프로세스가 다른 프로세스에 대해 파일을 개폐하는 것을 허용 합니다) 및 오픈 파일이 포함됩니다. flags (은)는 다음의 항목의 윤리화 (OR)입니다.
RFPROC
    설정되어 있는 경우, 새로운 프로세스가 작성됩니다. 그렇지 않은 경우, 변경이 현재의 프로세스에 영향을 미칩니다. 현재의 실장은, 이 플래그가 반드시 설정되어 있는 것을 요구합니다.
RFNOWAIT
    설정되어 있는 경우, child process는 parent process로부터 분리됩니다. 종료시에, child process는, parent process가 모으는 스테이터스를 남기지 않습니다. wait(2) (을)를 참조해 주세요.
RFFDG
    설정되어 있는 경우, 기동측의 파일 기술자 테이블 ((intro) 2 (을)를 참조)가 카피됩니다. 그렇지 않은 경우, 2 개의 프로세스가 1 개의 테이블을 공유합니다.
RFCFDG
    설정되어 있는 경우, 새로운 프로세스는 새로운 파일 기술자 테이블로 개시합니다. RFFDG (와)과는 서로 배타적입니다.
RFMEM
    설정되어 있는 경우, 통상, 하드웨어의 페이지 테이블을 직접 공유하는 것으로, 커널은 address 공간 전체의 공유를 강제합니다. 아이는, 이러한 방법으로, parent process가 소유하고 있는 모든 세그먼트(segment)를, 그것이 평상시 공유 가능한가 아닌가에 관계없이, 계승해 공유합니다. 스택 세그먼트는 분할되지 않는다 (부모와 아이의 양쪽 모두가 같은 스택상에 복귀한다) 의로, RFMEM 플래그를 지정했다 rfork() (은)는 일반적으로, C 언어를 포함한 고급언어로부터 직접 호출할 수 없습니다. 모두 설정 가능한 플래그는 RFPROC 뿐입니다. 이 문제를 해결해, 제공된 스택상에서 새로운 프로세스를 달리게 하기 위해서(때문에) 보조 함수가 제공되고 있습니다. 자세하게는 rfork_thread(3) (을)를 참조해 주세요.
RFSIGSHARE
    설정되어 있는 경우, 커널은, 부모와 자식 사이에 sigacts 구조체를 공유하는 것을 강제합니다.
RFLINUXTHPN
    설정되어 있는 경우, 커널은, 아이에 대한 thread 종료시에, SIGCHILD 대신에 SIGUSR1 를 돌려줍니다. 이것은 특정의 Linux 클론 동작을 모방하기 (위해)때문입니다.

공유 파일 기술자 테이블내의 파일 기술자는, 명시적으로 닫혀지는지, 또는 테이블을 공유하고 있는 모든 프로세스가 종료할 때까지 연 채로로 유지됩니다.

RFPROC 하지만 설정되어 있는 경우, parent process내에서 돌려주어지는 값은 child process의 프로세스 ID 입니다. child process내에서 돌려주어지는 값은 0 입니다. RFPROC 하지만 없는 경우, 반환값은 0 입니다. 프로세스 ID 의 범위는 1 으로부터 최대 정수치 (int) 입니다. 필요하면, 요구된 프로세스 리소스가 이용할 수 있게 될 때까지 rfork() (은)는 대기합니다.

fork() (은)는, rfork(RFFDG | RFPROC) 에의 호출로서 실장 가능합니다만, 후방 호환성을 위해서(때문에) 그처럼은 실장되고 있지 않습니다.

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

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

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

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

[EAGAIN]
    유저가 슈퍼 유저가 아니고, 리소스 파라미터 RLIMIT_NOFILE 에 대응하는 소프트 리소스의 제한을 초과해 버립니다 (getrlimit(2) (을)를 참조).

[EINVAL]
    RFPROC 플래그가 지정되지 않았습니다.

[EINVAL]
    RFFDG 플래그와 RFCFDG 플래그의 양쪽 모두가 지정되었습니다.

[ENOMEM]
    새로운 프로세스용으로 충분한 스왑 공간이 부족했습니다.

관련 항목
fork(2), intro(2), minherit(2), vfork(2), rfork_thread(3)

버그
FreeBSD (은)는 native 인 clone() 프로그램 라이브러리 콜을 아직도 실장되고 있지않고, 현재의 pthreads 실장은 RFMEM 를 지정했다 rfork() (을)를 이용하고 있지 않습니다. linux thread 프로그램 라이브러리의 native port 인, /usr/ports/devel/linuxthreads (은)는 RFMEM 를 이용해 동작한다 clone() 호출을 포함하고 있습니다. rfork_thread() 프로그램 라이브러리 함수는 clone() 의 대신으로서 이용할 수가 있습니다.

역사
rfork() 함수는 Plan9 그리고 처음 등장했습니다.