프로세스의 핸들 테이블 도입
핸들 테이블은 핸들 정보를 저장하고 있는 테이블로서 프로세스별로 독립적이다.
쉽게 말해 각각의 프로세스가 자신만의 핸들 테이블을 하나씩 구성하고 관리한다.
프로세스가 CreateProcess 함수나 CreateMailslot 과 가은 함수 호출을 통해 리소스 생성을
요구한 결과로 핸들 정보를 얻게 될 경우, 프로세스 자신에게 속해 있는 핸들 테이블에 해당 정보가 등록된다.
여기서 가장 중요한 것은 핸들 테이블은 프로세스별로 독립적이라는 것이다.
핸들의 상속
CreateProcess 함수를 호출하면 새로운 자식 프로세스가 생성된다.
또한 자식 프로세스를 위한 핸들 테이블도 더불어 생성된다.
이때 부모 프로세스의 핸들 테이블과 자식 프로세스의 핸들 테이블은 어떤 관계가 있을까?
그것은 CreaetProcess 함수 호출 시 전달되는 인자(다섯번째)가 무엇이냐에 따라서 부모 프로세스 핸들 테이블에
등록되어 있는 핸들 정보는 새롭게 생성되는 자식 프로세스에게 상속될 수 있다.
이러한 특성은 여러 상황에서 유용하게 사용 될 수 있다.
핸들의 상속에 대한 이해
자식 프로세스는 부모 프로세스의 핸들 테이블에 등록되어 있는 핸들 정보를 상속받을 수 있다.
하지만 모든 핸들 정보를 상속받는 것은 아니다.
부모 프로세스 핸들 테이블에서 상속여부가 Y 인 것만 상속받을 수 있으며,
자식 프로세스 핸들 테이블에서 상속여부에 대한 정보도 변경 없이 그대로 상속된다.
따라서 자식이 또 다른 자식을 생성해도 이 핸들에 대한 정보는 계속해서 상속된다.
그렇다면 상속되는 핸들과 상속되지 않는 핸들에 대한 기준은 어디서 나뉠까?
이는 리소스를 생성하는 함수의 전달인자를 통해 프로그래머가 결정할 수 있다.
핸들의 상속을 위한 전달 인자
모든 자식 프로세스가 무조건 부모 프로세스의 핸들을 상속하는 것은 아니다.
다음은 CreateProcess 함수의 선언이다.
BOOL WINAPI CreateProcess(
__in LPCTSTR lpApplicationName,
__in_out LPTSTR lpCommandLine,
__in LPSECURITY_ATTRIBUTES lpProcessAttributes,
__in LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in BOOL bInheritHandles,
__in DWORD dwCreationFlags,
__in LPVOID lpEnvironment,
__in LPCTSTR lpCurrentDirectory,
__in LPSTARTUPINFO lpStartupInfo,
__out LPPROCESS_INFORMATION lpProcessInformation
);
이 함수의 다섯번째 전달인자는 자식 프로세스에게 핸들 테이블에 등록되어 있는
핸들정보를 상속할 건지 말건지 결정하는 요소다.
TRUE 일 경우 핸들 테이블 정보는 자식에게 상속된다.
핸들의 상속 여부를 결정하는 것이 아니라, 부모 프로세스가 소유하고 있는 핸들 테이블
정보의 상속 여부를 결정하는 것이다.
'Windows > System Programming' 카테고리의 다른 글
프로세스 정보를 얻는 예 (소스코드) (0) | 2011.08.12 |
---|---|
핸들의 상속과 커널 오브젝트의 Usage Count (0) | 2011.08.12 |
커널 오브젝트의 두 가지 상태 (0) | 2011.08.12 |
메일슬롯과 IPC 에 대한 고찰 (0) | 2011.08.12 |
메일슬롯 (MailSlot) 의 예 (0) | 2011.08.12 |