1. 핸들 테이블과 오브젝트 핸들의 상속

: 오브젝트 핸들의 상속과 핸들 테이블에 대한 개념을 소개할 것이다.

: Windows 운영체제를 이해하는데 도움이 되며, 파이프 기반 IPC를 이해하는데 필요하다

* 프로세스의 커널 오브젝트 핸들 테이블

- 핸들과 커널 오브젝트의 리뷰

: 리소스(프로세스)를 관리하기위해 커널 오브젝트가 생성되고 그 결과 이를 가르키는 핸들이 반환된다. 이때 핸들은 특정 주소를 가르키게 되는데 사용자는 핸들 테이블을 참조하여 특정 주소를 참조할 수 있다.

- 프로세스의 핸들 테이블 도입

: 핸들 테이블은 핸들 정보를 저장하고 있는 테이블로써 프로세스 별로 독립적이다.

: 각각의 프로세스가 자신만의 핸들 테이블을 하나씩 구성하고 관리한다.

: 프로세스가 CreateProcess 함수나 CreateMailslot과 같은 함수 호출을 통해서 리소스 생성을 요구한 결과로 핸들 정보를 얻게 될 경우, 프로세스 자신에게 속해 있는 핸들 테이블에 해당 정보가 등록된다.

: 핸들 테이블은 프로세스 별로 독립적이다.

* 핸들의 상속

: CreateProcess 함수 호출시 전달되는 인자 가 무엇이냐에 따라서 부모 프로세스 핸들테이블에 등록되어 있는 핸들 정보가 자식프로세스에게 상속될 수 있다.

- 핸들의 상속에 대한 이해

: 부모 프로세스 핸들 테이블의 상속여부에 따라 자식의 핸들 테이블에 상속이 될지 말지 결정된다. 각 항목의 상속 여부 또한 상속이 되므로 변경하지 않는이상 상속된 항목은 계속 상속된다.

- 핸들의 상속을 위한 전달인자

: CreateProcess의 다섯번째 전달인자인 bIngeritHandle 이 자식 프로세스에게 핸들 테이블에 등록되어 있는 핸들정보를 상속해 줄것인지를 결정한다.

- 핸들의 상속과 커널 오브젝트의 Usage Count

: 프로세스가 핸들을 얻게 되었다는 의미는 핸들 테이블에 해당 핸들에 대한 정보가 갱신 되었음을 의미하는 것이다.

- 상속이 되기 위한 핸들의 조건

: SECURITY_ATTRIBUTES 구조체를 확인하고 내부 상속 속성은 TRUE로 설정해준뒤 CreateMailslot 함수의 인자로(주소값을) 넘겨준다.

: 결국 CreateProcess 함수 호출시 핸들 상속과 관련해서 두가지 사항을 결정해야한다.

1. 부모 프로세스 핸들 테이블의 상속여부

2. 생성된 자식 프로세스 핸들의 상속여부

* 예제를 통해서 확인하는 핸들 정보의 상속

: 자식 프로세스가 부모의 핸들 테이블을 상속하여 메일슬롯을 통해 IPC를 할 수 있다.

: 핸들 테이블은 운영체제에 의해 관리되기 때문에 등록된(상속된) 핸들 정보를 자식 프로세스는 확인할 수 없다.

: 부모 프로세스가 자식 프로세스에게 핸들 정보를 자식 프로세스에게 전달해 줘야만 상속된 핸들이 의미를 지니게 된다.

* Pseudo 핸들과 핸들의 중복(Duplicate)

: GetCurrentProcess 함수를 통해 얻은 자신의 핸들은 가짜(pseudo) 핸들이라고 한다. 이렇게 얻어진 핸들은 핸들 테이블에 등록되어 있지 않은 핸들이기 때문이다.

: DuplicateHandle을 이용하면 진짜 핸들을 얻을 수 있다.

: 가짜 핸들을 복사하여 자신의 핸들 테이블에 등록하는 것이므로, 커널 오브젝트를 가리키는 핸들이 두개가 된다. 그러므로 CloseHandle 함수를 통해 Usage Count를 감소시켜주어야 한다.

* 부모 프로세스의 핸들을 자식 프로세스에게 전달하기

: DuplicateHandle을 이용하여 상속가능한 핸들을 테이블에 등록하면 상속이 된다.

2. 파이프 방식의 IPC

* 메일슬롯에 대한 회고와 파이프의 이해

: Windows의 파이프 메커니즘에는 Anonymous Pipe와 Named Pipe 두가지가 있다.

: 메일슬롯은 서로 관련이 없는 프로세스들 사이에서 통신할 떄 유용한 IPC 기법이다. 브로드 캐스트 방식의 단방향 통신이므로 동시에 여러 프로세스에게 발송이 가능하다.

: Anonymous Pipe는 관계가 있는 프로세스 사이에서 통신하는 경우에 유용하다.

: Named Pipe는 관계가 없는 프로세스들 사이에서도 데이터를 주고 받을 수있으며 양방향 통신이 가능하다. 따라서 간단한 채팅 프로그램을 만들어보기 용이하다.

* Anonymous Pipe

: CreatePipe 함수로 구현하며, 데이터를 읽고, 쓰는 파이프의 주소값을 반환받아 여기에 파일을 읽고, 쓰면 원하는 값을 얻을 수 있다.


* Named Pipe

: Server 프로세스가 CreateNamedPipe 함수를 통해 파이프를 생성한 뒤 ConnectNamedPipe 함수를 호출하여 연결 요청을 기다리는 파이프로 상태를 변경한다.

: Client 가 CreateFile통해 연결 요청을 위한 리소스를 생성하고 연결을 시도한다.

: 자세한 예제는 책을 참고하자

3. 프로세스 환경변수

: 프로세스 생성시 main 함수의 매개변수를 통해 핸들 정보를 전달하는 것이 안전하다.

: 프로세스 별로 별도의 메모리 공간에 문자열 데이터를 저장하고 관리할 수 있도록 되어있다.  [key, value] 형식이며 상속, 부모 프로세스에서 자식의 환경변수 등록 모두 가능하다. 


뇌를 자극하는 윈도우즈 시스템 프로그래밍
국내도서
저자 : 윤성우
출판 : 한빛미디어 2007.03.30
상세보기


+ Recent posts