VFORK(2)

명칭
vfork - 효율적인 방법으로 가상 메모리에 새로운 프로세스를 생성

프로그램 라이브러리
libc

서식
<unistd.h> int vfork(void)

해설
vfork() 그럼, 낡은 프로세스의 address 공간을 완전하게 카피하지 않고 , 새로운 프로세스를 작성할 수 있습니다. 페이징 하는 환경에서는, 낡은 프로세스의 address 공간을 완전하게 카피하는 것은, 매우 비효율적입니다. fork(2) 하는 목적이, execve(2) (을)를 위한 새로운 시스템 문맥의 작성인 경우에 유효합니다. vfork() (은)는, execve(2) (을)를 호출하는지, 종료한다 ( _exit(2) (을)를 호출하는지 이상종료(ABEND) 한다)까지 아이가 부모의 메모리와 컨트롤의 thread를 빌린다고 하는 점으로, fork(2) (와)과 다릅니다. parent process는, 아이가 리소스를 사용하고 있는 동안 정지됩니다.

vfork() (은)는, 0 을 아이의 문맥에, 그리고 ( 후에) 아이의 pid 를 부모의 문맥에 되돌립니다.

통상의 경우, vfork() 하 fork(2) (와)과 같이 사용할 수 있습니다. 그러나, vfork() (을)를 호출한 프로시저로부터 아이의 문맥으로 동작하고 있는 동안에 동작해 돌아올 것은 없습니다. 최종적으로 vfork() (으)로부터 돌아오면(자), 존재하지 않는 스택 프레임으로 돌아오기 때문입니다. execve(2) (을)를 실행할 수 없는 경우는, exit(3) (이)가 아니고, _exit(2) (을)를 호출해 주세요. exit(3) (은)는 표준 입출력 채널을 플래시 해 닫기 (위해)때문에, parent process의 표준 입출력 데이터 구조 건강을 해쳐 버립니다. ( fork(2) 그렇지만, 버퍼에 들어가 있는 데이터가 2 회 플래시 되므로, exit(3) (을)를 호출하지 말아 주세요. )

관련 항목
execve(2), fork(2), rfork(2), sigvec(2), wait(2), _exit(2), exit(3)

반환값
fork(2) (와)과 같습니다.

버그
이 시스템 콜은, 적절한 시스템 공유 메카니즘 하지만 실현되었을 때에 삭제됩니다. 삭제되었을 경우는, fork(2) (이)라고 동의가 되므로, vfork(2) 의 메모리 공유의 현실장에는 의존하지 말아 주세요.

데드 록을 피하기 (위해)때문에, vfork() 의 도중에 아이가 되는 프로세스에는, SIGTTOU 시그널이나 SIGTTIN 시그널이 송신되지 않습니다. 그 대신에 출력, 또는, ioctl(2) 호출이 허가되어 입력하려고 하면(자) EOF 가 됩니다.

역사
vfork() 함수 호출은, 2.9BSD 그리고 등장했습니다.