vfork 예제

이러한 개념의 대부분은 프로그래밍 예제를 사용하여 설명합니다. 이 기사에서는 포크, vfork, exec 및 대기 시스템 호출, 구별되는 문자 및 더 잘 사용할 수있는 방법을 다룹니다. 나는 리눅스 민트 19 XFCE의 가상 단말기에서 첫 번째 예를 시도하고, 그것은 오류를 생산 : Vfork() 행동은 아래 프로그램에서 자세한 내용은 설명했다. 먼저 컨텍스트 전환은 사용자 모드에서 커널(시스템) 모드로 전환됩니다. 이것은 우리가 사용하는 프로세스 우선 순위 및 유닉스 / 리눅스 운영 체제를 기반으로합니다. 위의 C 예제 코드에서 컨텍스트의 항목인 « { » 열기 중괄호를 사용하고 있으며 « } » 닫는 곱슬 교정기는 컨텍스트를 종료하기 위한 것입니다. 다음 표는 컨텍스트 전환을 매우 명확하게 설명합니다. vfork() 함수는 exec() 함수 패밀리 중 하나를 호출하기 전에 프로세스 상태(예: 파일 설명자 닫기)를 조작해야 하는 경우 새 프로세스를 만드는 효율적인 메커니즘을 제공합니다. 그러나 vfork()는 새 Windows 프로세스 컨텍스트를 만들지 않습니다. 따라서 vfork() 작업의 자식에서 getpid()를 호출하면 상위값과 동일한 값이 반환됩니다. vfork()에서 반환되는 프로세스 ID는 실제로 exec()ed 자식의 프로세스 ID입니다.

프로세스 모델에 대한 자세한 내용은 PTC MKS 툴킷 UNIX에서 Windows 포팅 가이드에 대한 Windows 개념 의 Windows 개념 장에서 프로세스 관리를 참조하십시오. Linux에서 fork()는 쓰기 중 복사 페이지를 사용하여 구현되므로 fork()에서 발생하는 유일한 페널티는 부모 페이지 테이블을 복제하고 자식에 대한 고유한 작업 구조를 만드는 데 필요한 시간과 메모리입니다. 그러나 나쁜 옛날에는 fork()이 호출자 데이터 공간의 전체 복사본을 만들어야 하는데, 이는 보통 이후에 exec()이 수행되기 때문에 불필요하게 수행됩니다. 따라서 효율성을 높이기 위해 BSD는 부모 프로세스의 주소 공간을 완전히 복사하지 는 않았지만 execve() 또는 종료가 발생할 때까지 부모 메모리와 제어 스레드를 대여한 vfork() 시스템 호출을 도입했습니다. 하위 프로세스가 리소스를 사용하는 동안 부모 프로세스가 일시 중단되었습니다. vfork()를 사용하는 것은 까다로웠다: 예를 들어, 부모 프로세스에서 데이터를 수정하지 않는 것은 레지스터에 어떤 변수가 있는지 아는 데 달려 있었다. 반환 값:- 자식 프로세스의 PID (프로세스 ID) 실행의 부모 스레드에서 반환 되 고 « 0 » 자식의 실행 스레드에서 반환 됩니다. 다음은 포크 시스템 호출의 작동 방식을 설명하는 c-프로그래밍 예제입니다.

자식 프로세스가 단순히 프로세스 상태를 수정한 다음 exec() 함수 중 하나를 호출할 때 vfork()를 사용해야 합니다. 공유 주소 공간 때문에 실행을 다시 시작할 때 부모에 영향을 주는 자식에서 아무 작업도 수행하지 않아야 합니다. 예를 들어 exec() 호출이 실패하면 종료()를 호출하면 상위 및 자식에 대한 표준 I/O 스트림 버퍼가 닫히기 때문에 _exit()를 호출하고 exit(하지 않음)를 호출해야 합니다. vfork() 시스템 호출은 3.0BSD에 나타났습니다. 4.4BSD에서 그것은 포크 () 대명사로 만들어졌지만 NetBSD는 http://www.netbsd.org/Documentation/kernel/vfork.html . 리눅스에서, 그것은 포크에 해당되었습니다 () 까지 2.2.0-pre6 정도. 이후 2.2.0-pre9 (i386에서, 다소 나중에 다른 아키텍처에) 그것은 독립적인 시스템 호출. 지원은 glibc 2.0.112에 추가되었습니다.

vfork는 vfork에서 만든 프로세스가 vfork의 반환 값 p를 저장하는 데 사용되는 pid_t 변수 이외의 데이터를 수정하거나 _exit() 또는 exec() 패밀리 중 하나를 호출하는 동안 다른 함수를 호출하는 경우 동작이 정의되지 않은 경우 를 제외하고 는 포크와 동일합니다.