를 호출 vfork()
하면 새 프로세스가 작성되고 새 프로세스가 스택을 제외하고 상위 프로세스의 프로세스 이미지를 차용합니다. 자식 프로세스에는 새로운 스택 스타가 부여되지만 return
호출 한 함수에서 허용하지 않습니다 vfork()
.
자식이 실행되는 동안 자식이 부모의 주소 공간을 빌 렸을 때 부모 프로세스가 차단됩니다.
당신이 무엇을하든, 단지 스택에 액세스하는 모든 것은 자식의 개인 스택만을 수정합니다. 그러나 전역 데이터를 수정하면 공통 데이터가 수정되므로 상위 데이터에도 영향을줍니다.
글로벌 데이터를 수정하는 것은 다음과 같습니다.
호출하면 _exit()
(중요, 호출하지 않음 exit()
) 자식이 종료되고 부모에게 제어권이 다시 부여됩니다.
exec*()
패밀리 에서 함수를 호출하면 새 프로그램 코드, 새 데이터 및 부모의 스택 일부로 새 주소 공간이 작성됩니다 (아래 참조). 준비가되면 자식은 더 이상 자식에서 주소 공간을 빌리지 않고 자체 주소 공간을 사용합니다.
주소 공간이 더 이상 다른 프로세스에서 사용되지 않으므로 제어는 상위에 다시 제공됩니다.
중요 : Linux에서는 실제 vfork()
구현 이 없습니다 . 리눅스가 아니라 구현 vfork()
쓰기에 복사를 기반으로 fork()
개념을 만들기 위해 SunOS의-4.0 1988 년 도입 사용자는 사용하는 것이 생각 vfork()
리눅스 그냥 공유 데이터를 설정하고 아이가 전화를하지 않은 상태에서 부모를 일시 중단, _exit()
또는 한 exec*()
기능.
따라서 리눅스는 실제 vfork()
커널에서 자식에 대한 주소 공간 설명을 설정할 필요가 없다는 사실로부터 이익을 얻지 못한다. 결과는 vfork()
보다 빠르지 않습니다 fork()
. 진짜를 구현하는 시스템에서 vfork()
, 그것은보다 빠른 일반적으로 3 배이다 fork()
포탄의 성능에 그 사용에 영향 vfork()
- ksh93
최근의 Bourne Shell
과 csh
.
ed 자녀에게 전화 exit()
를 걸어서 vfork()
는 안되는 이유는 전화 exit()
하기 전에 데이터가 유출되지 않은 경우 stdio 를 플러시하기 때문 vfork()
입니다. 이상한 결과가 발생할 수 있습니다.
BTW : posix_spawn()
는 위에 구현되어 vfork()
있으므로 vfork()
OS에서 제거되지 않습니다. 리눅스가 사용하지 않는 것으로 언급 vfork()
되었다 posix_spawn()
.
스택의 경우 문서가 거의 없으며 Solaris 매뉴얼 페이지의 내용은 다음과 같습니다.
The vfork() and vforkx() functions can normally be used the
same way as fork() and forkx(), respectively. The calling
procedure, however, should not return while running in the
child's context, since the eventual return from vfork() or
vforkx() in the parent would be to a stack frame that no
longer exists.
따라서 구현은 원하는대로 할 수 있습니다. Solaris 구현은 함수 호출의 스택 프레임에 공유 메모리를 사용합니다 vfork()
. 어떤 구현도 부모로부터 스택의 오래된 부분에 대한 액세스 권한을 부여하지 않습니다.