프로세스 작성을위한 UNIX 시스템 호출 인 fork ()는 상위 프로세스를 복사하여 하위 프로세스를 작성합니다. 내 이해는 거의 항상 자식 프로세스의 메모리 공간 (텍스트 세그먼트 포함)을 대체하기 위해 exec ()를 호출한다는 것입니다. fork ()에서 부모의 메모리 공간을 복사하는 것은 항상 낭비 적 인 것처럼 보입니다 (메모리 세그먼트를 복사 할 때 복사하여 포인터 만 복사하면 낭비를 최소화 할 수 있음을 알지만). 어쨌든 프로세스 복제에 왜이 복제 방식이 필요한지 아는 사람이 있습니까?
답변
인터페이스를 단순화하는 것입니다. 에 대한 대안 fork
과는 exec
윈도우 같은 것 의 CreateProcess 기능. 얼마나 많은 매개 변수 CreateProcess
가 있고 많은 매개 변수 가있는 구조체입니다. 때문입니다 모든 새 과정에 대해 제어 할 수있는가에 전달되어야한다 CreateProcess
. 실제로 CreateProcess
충분한 매개 변수가 없으므로 Microsoft는 CreateProcessAsUser 및 CreateProcessWithLogonW 를 추가해야했습니다 .
fork/exec
모델을 사용하면 모든 매개 변수가 필요하지 않습니다. 대신 프로세스의 특정 속성이에 유지 exec
됩니다. 이것은 당신이 할 수 있습니다 fork
, 다음 (일반적으로 사용하는 것과 동일한 기능을 사용하여) 당신이 원하는 속성을 어떤 과정을 변경 한 후 exec
. Linux에서는 fork
매개 변수 execve
가 없으며 3 : 실행할 프로그램, 명령 줄 및 환경이 있습니다. (다른 exec
기능이 있지만 execve
일반적인 사용 사례를 단순화하기 위해 C 라이브러리에서 제공하는 래퍼 입니다.)
다른 현재 디렉토리와 프로세스를 시작하려면 : fork
, chdir
, exec
.
stdin / stdout :을 리디렉션하려면 fork
파일을 닫거나 엽니 다 exec
.
당신은 스위치 사용자가 원하는 경우 fork
, setuid
, exec
.
이 모든 것을 필요에 따라 결합 할 수 있습니다. 누군가가 프로세스 속성의 새로운 종류와 함께 온다면, 당신은 변경할 필요가 없습니다 fork
와 exec
.
Larsk가 언급했듯이 대부분의 최신 Unix는 COW (Copy-On-Write)를 사용하므로 fork
상당한 오버 헤드가 발생하지 않습니다.
답변
cjm의 답변과 함께 Single Unix Specification은이라는 함수를 정의합니다 vfork()
. exec familly 함수를 호출하거나을 호출하는 것 이외의 다른 작업을 수행하는 경우 분기 된 프로세스에 정의되지 않은 동작이 있다는 점을 제외하면 해당 함수는 포크와 같이 작동합니다 _exit()
.
따라서 정의 된 동작에 대한 유일한 사용은 다음과 같습니다.
pid_t ret = vfork();
if(ret == 0)
{
exec(...);
_exit(EXIT_FAILURE); //in case exec failed for any reason.
}
그래서 무엇을 vfork
합니까? 그것은 싸다 fork
. 기록 중 복사가없는 구현에서는 결과 프로세스가 원래 프로세스와 메모리 공간을 공유하므로 정의되지 않은 동작이 발생합니다. 기록 중 복사 구현이 빠르기 때문에 기록 중 복사를 사용한 구현 vfork
에서는와 동일 할 수 있습니다 fork()
.
새로운 프로세스를 직접 생성 할 수 있는 선택적 posix_spawn
기능 (및 posix_spawnp
기능)도 있습니다. (라이브러리 호출을 이용하여 이들을 구현하는 것도 허용된다 fork
하고 exec
, 및 구현 예들이 제공된다.)