포크 - exec
Fork–execFork – exec은 실행 프로세스가 새로운 프로그램을 생성하는 Unix에서 일반적으로 사용되는 기술입니다.
묘사
fork()는 부모 프로세스가 자신을 2개의 동일한 프로세스로 '연결'하기 위해 사용하는 시스템콜 이름입니다통화 후fork()작성된 자녀 프로세스는 fork() 콜의 반환값을 제외하고 부모 프로세스와 동일합니다.여기에는 열려 있는 파일, 레지스터 상태 및 프로그램의 실행 코드를 포함한 모든 메모리 할당이 포함됩니다.경우에 따라서는, 2개의 바이너리가 계속해 같은 바이너리를 실행하고 있는 경우도 있습니다만, 많은 경우, 1개의 바이너리(보통 아이)가 다른 바이너리 실행 파일을 실행하는 것으로 바뀝니다.exec()시스템 콜을 실행합니다.
프로세스가 분기하면 실행 중인 프로그램의 완전한 복사본이 새 프로세스로 만들어집니다.이 새로운 프로세스는 부모 프로세스의 하위 프로세스이며 새로운 프로세스 식별자(PID)가 있습니다.그fork()함수는 하위의 PID를 상위 프로세스로 반환합니다.그fork()함수는 자 프로세스에 0을 반환합니다.이것에 의해, 같은 2개의 프로세스가 서로 구별할 수 있게 됩니다.
상위 프로세스는 실행을 계속하거나 하위 프로세스가 완료될 때까지 기다릴 수 있습니다.아이는 자신이 아이임을 알게 된 후 자신을 다른 프로그램으로 완전히 대체하여 원래 프로그램의 코드와 주소 공간을 잃게 됩니다.
부모가 아이가 죽을 때까지 기다리도록 선택하면 부모는 아이가 실행한 프로그램의 종료 코드를 받게 됩니다.자녀가 좀비가 되는 것을 방지하기 위해 부모는 정기적으로 또는 자녀 프로세스가 종료되었음을 나타내는 SIGCHLD 신호를 수신했을 때 자녀에게 대기 호출을 해야 합니다.
또, 모든 것을 청소할 필요가 있는 경우는, SIGCHLD 의 신호 핸들러를 사용해, 아이가 종료할 때까지 비동기적으로 대기할 수도 있습니다.다음으로 착신 SIGCHLD 신호를 포착하여 여러 신호를 동시에 처리하는 신호 핸들러의 예를 나타냅니다.
무효 정리하다(인트 신호.) { 하는 동안에 (waitpaid((pid_t) (-1), 0, 행) > 0) {} } 자녀가 호출을 처리하는 경우exec()원래 프로그램의 모든 데이터가 손실되고 새 프로그램의 실행 복사본으로 대체됩니다.이를 오버레이라고 합니다.모든 데이터는 대체되지만 상위에서 열려 있던 파일 기술자는 프로그램에서 명시적으로 실행 시 닫힘으로 표시한 경우에만 닫힙니다.이를 통해 콜하기 전에 부모가 파이프를 작성하는 일반적인 방법을 사용할 수 있습니다.fork()실행한 프로그램과 통신하기 위해 사용합니다.
Microsoft Windows 에서는, 다음과 같은 시스템 콜이 없기 때문에, fork-exec 모델은 서포트되고 있지 않습니다.fork().그spawn()프로세스에서 선언된 함수 패밀리.h는 에 대한 호출이 필요한 경우 해당 함수 패밀리를 대체할 수 있습니다.fork()에 직접 이어집니다.exec().
WSL에서 포크시스템 콜이 이루어지는 경우 lxss.sys는 프로세스의 복사를 준비하기 위한 초기 작업의 일부를 수행합니다.그런 다음 내부 NT API를 호출하여 올바른 시멘틱스로 프로세스를 생성하고 동일한 레지스터 컨텍스트로 프로세스에 스레드를 만듭니다.마지막으로 프로세스 복사를 완료하기 위해 몇 가지 추가 작업을 수행하고 실행을 시작할 수 있도록 새 프로세스를 재개합니다.
--
레퍼런스
- "File Descriptors cross fork (2)/exec (2)", 운영체제(코스 304-427B), McGill University 전기공학부 Franco Callari
- 캠브리지 대학 공학부, Tim Love "fork and executive"
- UNIX 환경에서의 고도의 프로그래밍, W. Richard Stevens, Adison-Wesley ISBN 0-201-56317-7
- UNIX 파워툴, Jerry Peek, Tim O'Reilly, Mike Loukides, O'Reilly, ISBN 1-56592-260-3