2011-07-05 4 views
7

Microsoft는 여기에서 안전합니다. 기사에서 "Creating a Child Process with Redirected Input and Output"은 다음과 같이 말하고 있습니다.자식 프로세스가 나중에 소유 한 상속 된 핸들을 닫아야합니까?

이 프로세스가 종료되면 나머지 열려있는 핸들이 정리됩니다.
큰 응용 프로그램에서 리소스가 누출되지 않도록 핸들을 명시 적으로 닫습니다.

이것은 전혀 쓸모가 없습니다. 무슨 처리합니까? 어떤 과정에서?


나는 그 주위에서 머리를 쓰고 싶다.

부모 프로세스에서 핸들을 SECURITY_ATTRIBUTES.bInheritHandle = TRUE과 함께 만들면 자식 프로세스가이를보고 사용할 수 있으며 핸들은 두 프로세스에서 동일한 값과 액세스 권한을 갖습니다.

그러나 동일한 핸들입니까, 아니면 동일한 숫자 표현을 가진 사본입니까?

hRead 핸들을 자식 프로세스에 전달하여 파이프에서 읽을 수 있도록하고 자식 프로세스가 핸들을 닫으면 도 부모 프로세스에서 닫아야합니까? 자식 프로세스 아래에서 파이프를 닦지 않습니까?

내 실험에 따르면 CloseHandle은 자식이 닫힌 후 자식에게 전달 된 hRead 핸들을 닫을 때 성공을 표시합니다. 이것은 강력히 주장합니다. 예, 닫아야합니다. 그러나 여기에 더 충실한 조언을 해주시면 감사하겠습니다.

답변

10

머리에 못을 꽂습니다. Win32는 기본 커널 모드 개체에 대한 사용자 모드 참조로 작동합니다. 새로운 객체와 기존 객체에 대한 핸들 (참조)은 일반적으로 일종의 CreateXXX 호출을 통해 생성됩니다. DuplicateHandle - {또는 핸들을 상속 가능으로 표시하고 새 프로세스를 생성하여 현재 또는 다른 프로세스에서 추가 참조를 만들 수 있습니다. 현재 프로세스의 핸들을 자식 프로세스로 복사하여 핸들 값이 동일하도록 보장합니다.}

이 시점에서 커널 개체에 대한 참조는 둘 이상 (둘 다 개체 잠금을 해제하고 소비 된 리소스를 모두 해제합니다.

+0

아. 자식 프로세스를 생성 할 때 핸들 *이 복제됩니다. 그게 내가 한 일이야. – GSerg

관련 문제