핸들테이블의 이해
- 핸들 테이블은 프로세스마다 독립적
핸들테이블의 상속
- CreateProcess 함수에서 5번째 인자 값으로 bInheritHandles라는 BOOL 값에 따라 핸들테이블 상속이 가능
- 핸들 테이블의 데이터 마다 상속 여부가 있으며, Y가 되어 있는 핸들 데이터만 상속이 가능
ex) 핸들 테이블 예시
핸들 | 주소 | 상속여부 |
127 | 0x1200 | Y |
168 | 0x1680 | N |
256 | 0x2400 | Y |
.....
SECURITY_ARRTIVUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE; // 핸들 상속 여부
.....
CreateMailSlot(....&sa); // &sa는 4번째 전달인자
핸들의 상속과 UC
- 자식 프로세스에게 상속이 이루어진 핸들은 접근 가능한 프로세스가 증가함으로 UC 카운트가 2가 됨
- 부모 프로세스가 Receiver 프로세스의 MailSlot을 만들고 자식 프로세스까지 핸들을 상속 받게 되면 UC는 2가 됨
- 자식 프로세스는 핸들 값을 통해 MailSlot의 영역에 접근이 가능
Pseudo(가짜) 핸들과 핸들의 중복 1
- A 프로세스가 생성되면 커널오브젝트도 함께 생성되며, 커널오브젝트의 핸들 정보가 핸들 테이블에 등록이 된다고 알지만 사실상 등록이 안됨 => GetCurrentProcess()는 Pseudo 핸들 값을 반환
- 핸들 테이블에 등록되지 않은 핸들 값은 모두 Pseudo 핸들
- A 프로세스가 B 프로세스를 생성할 때, 자식인 B프로세스는 부모 프로세스의 상태를 알기 위해 A프로세스의 핸들 정보를 상속를 상속 받아야 함
- A 프로세스는 자기 자신의 핸들 정보를 핸들 테이블에 등록해야 하는 이때 DuplicateHandle() 함수를 사용함
- DuplicateHandle(A 핸들, 핸들 값, B 핸들, &val, ...);
- 핸들 값과 주소를 다를 수 있으며, 주소 값만 제대로 등록되었으며 접근이 가능
Pseudo(가짜) 핸들과 핸들의 중복 2
// 자신의 프로세스 핸들 정보를 자신의 핸들 테이블에 복사해서 등록
DuplicateHandle(
GetCurrentProcess(),
GetCurrentProcess(),
GetCurrentProcess(),
&hProcess,
0,
TRUE,
DUPLICATE_SAME_ACCESS
);
'시스템 프로그래밍' 카테고리의 다른 글
9. 프로세스의 스케줄링 (0) | 2022.05.24 |
---|---|
8-3. 파이프 방식의 IPC (0) | 2022.05.20 |
8-1. 프로세스 환경변수 (0) | 2022.05.20 |
7-2. Signaled & Non-Signaled (0) | 2022.05.17 |
7-1. 프로세스간 통신(IPC) (0) | 2022.05.17 |