vfork 예제

By August 2, 2019Uncategorized

반환 값:- 자식 프로세스의 PID (프로세스 ID) 실행의 부모 스레드에서 반환 되 고 “0” 자식의 실행 스레드에서 반환 됩니다. 다음은 포크 시스템 호출의 작동 방식을 설명하는 c-프로그래밍 예제입니다. 먼저 컨텍스트 전환은 사용자 모드에서 커널(시스템) 모드로 전환됩니다. 이것은 우리가 사용하는 프로세스 우선 순위 및 유닉스 / 리눅스 운영 체제를 기반으로합니다. 위의 C 예제 코드에서 컨텍스트의 항목인 “{” 열기 중괄호를 사용하고 있으며 “}” 닫는 곱슬 교정기는 컨텍스트를 종료하기 위한 것입니다. 다음 표는 컨텍스트 전환을 매우 명확하게 설명합니다. 이러한 개념의 대부분은 프로그래밍 예제를 사용하여 설명합니다. 이 기사에서는 포크, vfork, exec 및 대기 시스템 호출, 구별되는 문자 및 더 잘 사용할 수있는 방법을 다룹니다. 나는 리눅스 민트 19 XFCE의 가상 터미널에서 첫 번째 예제를 시도하고 오류를 생성 : 당신은 당신의 자식 프로세스가 단순히 프로세스 상태를 수정한 다음 exec() 기능 중 하나를 호출 할 때 vfork()를 사용해야합니다. 공유 주소 공간 때문에 실행을 다시 시작할 때 부모에 영향을 주는 자식에서 아무 작업도 수행하지 않아야 합니다. 예를 들어 exec() 호출이 실패하면 종료()를 호출하면 상위 및 자식에 대한 표준 I/O 스트림 버퍼가 닫히기 때문에 _exit()를 호출하고 exit(하지 않음)를 호출해야 합니다. Linux에서 fork()는 쓰기 중 복사 페이지를 사용하여 구현되므로 fork()에서 발생하는 유일한 페널티는 부모 페이지 테이블을 복제하고 자식에 대한 고유한 작업 구조를 만드는 데 필요한 시간과 메모리입니다. 그러나 나쁜 옛날에는 fork()이 호출자 데이터 공간의 전체 복사본을 만들어야 하는데, 이는 보통 이후에 exec()이 수행되기 때문에 불필요하게 수행됩니다.

따라서 효율성을 높이기 위해 BSD는 부모 프로세스의 주소 공간을 완전히 복사하지 는 않았지만 execve() 또는 종료가 발생할 때까지 부모 메모리와 제어 스레드를 대여한 vfork() 시스템 호출을 도입했습니다. 하위 프로세스가 리소스를 사용하는 동안 부모 프로세스가 일시 중단되었습니다. vfork()를 사용하는 것은 까다로웠다: 예를 들어, 부모 프로세스에서 데이터를 수정하지 않는 것은 레지스터에 어떤 변수가 있는지 아는 데 달려 있었다. vfork() 함수는 exec() 함수 패밀리 중 하나를 호출하기 전에 프로세스 상태(예: 파일 설명자 닫기)를 조작해야 하는 경우 새 프로세스를 만드는 효율적인 메커니즘을 제공합니다. 그러나 vfork()는 새 Windows 프로세스 컨텍스트를 만들지 않습니다. 따라서 vfork() 작업의 자식에서 getpid()를 호출하면 상위값과 동일한 값이 반환됩니다. vfork()에서 반환되는 프로세스 ID는 실제로 exec()ed 자식의 프로세스 ID입니다. 프로세스 모델에 대한 자세한 내용은 PTC MKS 툴킷 UNIX에서 Windows 포팅 가이드에 대한 Windows 개념 의 Windows 개념 장에서 프로세스 관리를 참조하십시오. Vfork() 행동은 아래 프로그램에서 자세히 설명합니다. 공식적으로 말하자면, 위에 언급 된 표준 설명은 다음 exec()가 실패 할 수 있기 때문에 vfork()을 사용할 수 없으며 어떤 일이 일어나는지 정의되지 않습니다.

어떤 사람들은 vfork()의 의미체계를 아키텍처 적 결점으로 간주하고, 4.2BSD 맨 페이지는 “적절한 시스템 공유 메커니즘이 구현될 때 이 시스템 호출이 제거될 것이다. 사용자는 vfork()의 의미체계를 공유하는 메모리에 의존해서는 안 되며, 이 경우 포크(2)의 대명사로 만들어져야 합니다.” 그러나 최신 메모리 관리 하드웨어가 fork(2)와 vfork(vfork)의 성능 차이를 감소시켰음에도 불구하고 Linux 및 기타 시스템이 vfork()를 유지한 데는 여러 가지 이유가 있습니다. vfork에 의해 생성된 프로세스는 vfork의 반환 값 p를 저장하는 데 사용되는 pid_t 형식의 변수 이외의 데이터를 수정하거나 _exit() 또는 exec() 패밀리 중 하나를 호출하는 다른 함수를 호출합니다.