본문 바로가기

펌글(출처명시)

fork (), vfork (), exec () 및 clone ()의 차이점 (펌)

https://ko.programqa.com/question/4856255/

 

fork (), vfork (), exec () 및 clone ()의 차이점 - linux - Program QA

Home linux fork (), vfork (), exec () 및 clone ()의 차이점 2011-02-01 linux process fork exec clone Google 에서이 4 가지의 차이점을 찾고 있었고이 정보에 대한 많은 양의 정보가있을 것으로 예상했지만 실제로는 4 개의 통화 사이에 확실한 비교가 없었습니다. 이러한 시스템 호출의 차이점을 살펴보면 일종의 기본 개요를 한눈에 살펴볼 수 있습니다. 이 모든 정보가 정확합니까 / 중요한

ko.programqa.com

 

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)를 호출하거나 치명적 신호를 수신 한 후 명시 적으로 종료 될 수도 있습니다.

 

입수 한 정보 :