exec fork 예제

Posted by abitou on Αυγ 02, 2019

필자의 셸은 사용자가 제공한 프로그램을 실행해야 합니다. 여기에 내 프로그램의 매우 단축 단순화 된 버전입니다 기능의 exec() 가족은 프로그램 내에서 프로그램을 시작합니다. 그들은 또한 execve ()에 다양한 프론트 엔드 기능입니다. 데니스 M. 리치가 포크 엑스펙을 만들었습니다. [1] fork()는 부모 프로세스가 자체(«포크»)를 두 개의 동일한 프로세스로 «분할»하는 데 사용하는 시스템 호출의 이름입니다. fork() 호출 후 생성된 자식 프로세스는 fork() 호출의 반환 값을 제외한 부모의 정확한 복사본입니다. 여기에는 열려 있는 파일, 레지스터 상태 및 프로그램의 실행 코드가 포함된 모든 메모리 할당이 포함됩니다. 경우에 따라 두 바이너리가 동일한 바이너리를 계속 실행하지만 종종 하나(일반적으로 자식)가 exec() 시스템 호출을 사용하여 다른 이진 실행 을 실행하도록 전환합니다. 프로세스가 execve 시스템 호출을 하면 어떻게 됩니까? 코드 및 데이터 세그먼트는 파일 이름으로 식별된 파일에 포함된 프로그램에 의해 초기화됩니다. 주목해야 할 가장 중요한 점은 동일한 프로세스 (pid는 이전과 동일함)이지만 새 프로그램을 실행하는 것입니다.

덧붙여, execve는 프로그램과 프로세스의 차이를 충분히 강조할 수 없는 한 가지 예입니다. 프로세스는 일부 작업을 수행 하도록 작성 된 프로그램을 실행 하기 위해 커널에 의해 만들어진 엔터티입니다. argv는 배열의 0th 요소가 프로그램 자체의 파일 이름인 프로그램에 대한 인수 배열입니다. envp는 형식, 이름 = 값의 환경 변수 배열입니다. argv 및 envp의 마지막 요소는 NULL이어야 합니다. argv와 envp 모두 프로그램의 주요 기능에 액세스 할 수 있습니다,로 호출되는, 프로세스 ID는 다르다. getppid() 호출자에서 (두 `p`s)는 부모에서 getpid()를 호출하는 것과 동일한 결과를 제공합니다. 자세한 내용은 포크 맨 페이지를 참조하십시오.

프로세스가 포크되면 실행 프로그램의 전체 복사본이 새 프로세스로 만들어집니다. 이 새 프로세스(부모의 자식)에는 새 프로세스 식별자(PID)가 있습니다. fork() 함수는 자식의 PID를 부모에게 반환하고 두 개의 동일한 프로세스가 서로 구분할 수 있도록 0을 자식에게 반환합니다. 함수 호출 «execve()»는 할당하는 환경에서 프로세스를 실행합니다. 자식 프로세스가 exec()를 호출하면 원래 프로그램의 모든 데이터가 손실되고 새 프로그램의 실행 중인 복사본으로 바뀝니다. 이를 오버레이라고 합니다. 모든 데이터가 대체되지만 상위에서 열린 파일 설명자는 프로그램이 해당 데이터를 임텍에 닫아 도는 것으로 명시적으로 표시한 경우에만 닫힙습니다.

Comments are closed.

Ο καιρός

ar8ra

advertisement