Google 에서이 4 가지의 차이점을 찾고 있었고이 정보에 대한 많은 양의 정보가있을 것으로 예상했지만 실제로는 4 개의 통화 사이에 확실한 비교가 없었습니다.
이러한 시스템 호출의 차이점을 살펴보면 일종의 기본 개요를 한눈에 살펴볼 수 있습니다. 이 모든 정보가 정확합니까 / 중요한 것이 누락 되었습니까?
Fork
: 포크 호출은 기본적으로 현재 프로세스의 복제본을 거의 모든 방식으로 동일하게 만듭니다 (예를 들어, 일부 구현에서 자원 제한과 같은 모든 것이 복사되지는 않지만 가능한 한 사본을 가깝게 만드는 아이디어입니다).
새 프로세스 (자식)는 다른 프로세스 ID (PID)를 가져오고 이전 프로세스 (부모)의 PID를 상위 PID (PPID)로 갖습니다. 두 프로세스가 이제 정확히 동일한 코드를 실행하고 있기 때문에 fork의 리턴 코드를 통해 어떤 프로세스가 어떤 것인지 알 수 있습니다. 하위는 0이되고 상위는 하위의 PID를 가져옵니다. 이것은 물론 포크 호출이 작동한다고 가정합니다. 그렇지 않으면 자식이 생성되지 않고 부모가 오류 코드를 얻습니다.
Vfork
: vfork와 fork의 기본 차이점은 vfork ()를 사용하여 새 프로세스를 만들 때 부모 프로세스가 일시적으로 중단되고 자식 프로세스가 부모의 주소 공간을 빌릴 수 있다는 것입니다. 이 이상한 상황은 자식 프로세스가 종료되거나 execve ()를 호출 할 때까지 계속되며,이 때 부모 프로세스는 계속됩니다.
즉, vfork ()의 자식 프로세스는 부모 프로세스의 변수를 예기치 않게 수정하지 않도록주의해야합니다. 특히, 자식 프로세스는 vfork () 호출을 포함하는 함수에서 리턴해서는 안되며 exit ()를 호출하지 않아야합니다 (종료해야하는 경우 _exit ()를 사용해야합니다. 실제로, 이는 자식에 대해서도 마찬가지입니다. 일반 포크 ()).
Exec :
exec 호출은 기본적으로 현재 프로세스 전체를 새로운 프로그램으로 대체하는 방법입니다. 프로그램을 현재 프로세스 공간으로로드하고 진입 점에서 실행합니다. exec ()는 현재 프로세스를 함수가 가리키는 실행 파일로 바꿉니다. exec () 오류가 없으면 컨트롤은 원래 프로그램으로 돌아 가지 않습니다.
Clone :
클론은 포크로서 새로운 프로세스를 만듭니다. 포크와는 달리, 이러한 호출을 통해 하위 프로세스는 메모리 공간, 파일 디스크립터 테이블 및 신호 핸들러 테이블과 같은 실행 컨텍스트의 일부를 호출 프로세스와 공유 할 수 있습니다.
자식 프로세스가 clone으로 생성되면 함수 응용 프로그램 fn (arg)이 실행됩니다. (이것은 원래 포크 호출 시점부터 자식에서 실행이 계속되는 포크와 다릅니다.) fn 인수는 실행 시작시 자식 프로세스가 호출하는 함수에 대한 포인터입니다. arg 인수는 fn 함수로 전달됩니다.
fn (arg) 함수 응용 프로그램이 리턴되면 하위 프로세스가 종료됩니다. fn에 의해 리턴 된 정수는 하위 프로세스의 종료 코드입니다. 하위 프로세스는 exit (2)를 호출하거나 치명적 신호를 수신 한 후 명시 적으로 종료 될 수도 있습니다.
입수 한 정보 :
- 포크와 exec의 차이점
- http://www.allinterview.com/showanswers/59616.html
- http://www.unixguide.net/unix/programming/1.1.2.shtml
- http://linux.about.com/library/cmd/blcmdl2_clone.htm
이것을 읽어 주셔서 감사합니다! :)
fork()
부모의 주소 공간을 빌릴 가능성이 있기 때문에 ( 리눅스와 아마도 모든 BSD와 다르게 구현 되는 경우) 가능합니다. 아무거나는 전화 외에, 수행 execve()
또는 _exit()
부모까지 혼란에 큰 잠재력을 가지고있다. 특히, exit()
호출 atexit()
처리기 및 기타 "완료 기"는 예를 들어 stdio 스트림을 비 웁니다. vfork()
아이 에게서 돌아 오면 (전과 같은 경고) 부모의 스택을 엉망으로 만들 수 있습니다.
fork
syscall 을 호출하는 스레드 만 있습니까?