윈도우즈 시스템 프로그래밍을 공부하면서 정리한 글입니다.
7장. 프로세스간 통신 (IPC) 1
I. 프로세스간 통신(IPC)의 의미
1. 프로세스의 커널 오브젝트 핸들 테이블
- 마이크로소프트에서 Windows 운영체제 소스코드를 공개하지 않아 핸들 테이블이 어떻게 관리되는지
알 방법이 없음
- 리소스 생성 과정에서 커널 오브젝트가 생성되면, 해당 오브젝트의 핸들이 반환
① 핸들과 커널 오브젝트의 리뷰 (Review)
=> 핸들 256을 통해 0x2400번지에 할당 되어 있는 메일 슬롯에 접근 가능
BUT 핸들 256이 0x2400번지의 커널 오브젝트를 의미한다는 정보가 없음
=> ∴핸들 테이블 개념을 도입
② 핸들 테이블의 도입
- 핸들 테이블은 핸들 정보를 저장하고 있는 테이블로서 프로세스 별로 독립적
2. 핸들의 상속
- CreateProcess 함수 호출 시 다섯번째 인자가 무엇이냐에 따라 부모 프로세스의 핸들 테이블이
자식 프로세스에게 상속될 수 있음
① 핸들의 상속에 대한 이해
- 자식 프로세스는 부모 프로세스의 핸들 테이블 정보를 상속 받을 수 있음
but 모든 핸들 정보를 상속 받진 않음
- 핸들 테이블에는 해당 핸들의 상속 여부 컬럼(column)이 존재
- 상속시, 상속 여부에 대한 정보도 변경 없이 그대로 상속됨
=> 자식 프로세스에 상속된 핸들은 또 다른 자식 프로세스 만들때도 상속됨
- 상속되는 핸들을 결정 하는건 프로그래머 몫
② 핸들의 상속을 위한 전달 인자
BOOL CreateProcess (
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
...
BOOL bInheritHandles // 핸들 상속 인자
...
);
- bInheritHandles -> TRUE 전달할 경우 부모 프로세스의 핸들 테이블은 상속됨
-> BUT 상속 여부가 Y 로 설정된 핸들에 한해서만 상속이 이루어짐
③ 핸들의 상속과 커널 오브젝트의 Usage Count (UC)
- 프로세스가 핸들을 얻게 되었다는 의미 : 핸들 테이블에 대한 정보가 갱신됨
ex) CreateMailslot 호출
⑴ 메일 슬롯 리소스 생성
⑵ 커널 오브젝트 생성
⑶ 핸들 정보가 핸들 테이블에 갱신 // 이때부터 프로세스가 핸들 정보를 얻음
⑷ CreateMailslot 함수를 빠져 나오면서 핸들값 반환
- 부모 프로세스 핸들 테이블에 있는 커널 오브젝트들 UC가 1
- 자식 프로세스 생성 후 상속여부가 Y 였던 커널 오브젝트는 UC가 1 증가 => UC=2가 됨
④ 상속이 되기 위한 핸들의 조건
- 핸들의 상속 여부는 리소스 생성되는 순간 결정 (핸들 테이블의 Y or N)
- LPSECURITY_ATTRIBUTES 구조체 = SECURITY_ATTRIBUTES의 포인터로 정의
- NULL 이 전달되면 상속이 되지 않음
BUT 구조체 변수를 적절히 초기화해 주소값 전달하면 상속 가능
typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength; // 구조체 변수 크기
LPVOID lpSecurityDescriptor; // 상속과 관계 없음
BOOL bInheritHandle; // 상속 여부 결정 TRUE : Y, FALSE : N
}
ex)
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
HANDLE hMailSlot = CreateMailslot( ... , &sa);
CreateProcess( ... , &sa, ... );
II. Pseudo (가짜) 핸들과 핸들의 중복 (Duplicate)
- 프로세스의 핸들은 Pseudo (가짜) 핸들
1. 프로세스의 커널 오브젝트 핸들 테이블