일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 이스케이퍼스
- 홍대 덤앤더머
- 홍대 방탈출 추천
- Android
- C++ 자료구조
- 유니티
- 넥스트에디션 2호점
- 개발
- 방탈출
- 홍대 방탈출
- 넥스트에디션
- C 자료구조
- 필활
- 꽃길
- 추천
- 방탈출 추천
- C#
- 이스케이퍼스 2호점
- PC VR
- Unity
- 윈도우 프로그래밍
- 방탈출 후기
- 후기
- 2021 방탈출 추천
- 방탈출 리뷰
- 시스템 프로그래밍
- 정렬 알고리즘
- 강남 방탈출
- 공포 방탈출
- 홍대
- Today
- Total
행복한 연어의 이야기
(윈도우 시스템) 8. 프로세스간 통신(IPC) 2 본문
1. 핸들 테이블과 오브젝트 핸들의 상속
IPC 통신 중 대표적인 방법으로는 메일슬롯과 파이프가 있다고 설명했다.
그 중 파이프 기반 IPC 를 소개하기전 이해하고 넘어가야할 핸들테이블에 대해 설명하고자 한다.
마이크로 소프트에서는 WIndows 운영체제를 공개하고 있지 않아 세밀한 부분까지 알 수 있는 방법은 없다.
그래서 가장 일반적인 형태로 프로세스 핸들 테이블을 관리하는 방법을 서술하며
실제로 WIndows 운영체제가 핸들 테이블을 관리하는 방법과 조금 차이가 있다.
프로세스의 커널 오브젝트 핸들 테이블
저번 7. 프로세스간 통신(IPC) 1에서 소개한 CreateMailslot 을 호출한다고 가정했을때
(CreateMailslot 함수의 반환값은 HANDLE 이다.)
CreateMailslot 으로 메일슬롯 프로세스와 그에 대응되는 메일슬롯 프로세스 커널 오브젝트를 운영체제가 생성하고
메일슬롯 프로세스 커널 오브젝트의 핸들정보를 함수를 호출한 프로세스에게 넘겨줄 것이다.
그러면 프로세스는 이 핸들값이 어떤 커널오브젝트를 가르키고 있는지 어떻게 알 수 있을까?
프로세스의 핸들 테이블 도입
각각의 프로세스는 자신만의 핸들테이블을 하나씩 가지고 있으며
핸들 테이블은 핸들 정보를 저장하고 있는 테이블이다.
프로세스가 CreateProcess 나 CreateMailslot 같은 함수를 통해서 새로운 핸들 정보를 얻게 될 경우
프로세스 자신이 가지고 있던 핸들테이블에 새로운 핸들정보를 추가하게 된다.
예시를 들면 아래와 같다.
핸들 | 커널오브젝트 주소 |
12 | 0x2800 |
134 | 0x6408 |
핸들의 상속
부모 자식간의 핸들테이블에는 CreateProcess 함수 호출시 전달되는 5번째 인자 BOOL bInheritHandles 에 따라
핸들 정보가 상속될수 있다.
핸들의 상속여부를 전달하는 것이 아니라 부모프로세스의 핸들테이블 상속여부를 결정하는 인자이다.
모든 핸들 정보가 상속되는 것은 아니고 핸들에 있는 상속여부에 따라 자식 프로세스에게 상속 될 수도 안될 수도 있다.
핸들 | 커널오브젝트 주소 | 상속여부 |
12 | 0x2800 | Yes |
134 | 0x6408 | No |
위 핸들테이블에서 프로세스를 생성할때 상속 여부를 TRUE 로 전달한다면 12번 핸들 정보만 상속될 것이다.
또한 상속 여부또한 상속되기때문에 자식 프로세스에서 또 자식 프로세스를 생성한다면
12번 핸들 정보는 또 다시 상속된다.
(상속과정에서 핸들 값은 바뀔 수 있다.)
6. 커널오브젝트와 오브젝트 핸들에서 Usage Count 는 참조하는 프로세스의 수 만큼 증가한다고 서술한 바 있다.
핸들 테이블에 핸들 정보를 가지고 있다 = 프로세스가 참조하고 있다. 라는 식이 성립한다.
상속이 되기 위한 핸들의 조건
핸들의 상속여부는 생성시에 결정된다.
CreateProcess 함수 3번쨰 인자, CreateMailSlot 4번째 인자를 보면
LPSECURITY_ATTRIBUTES 구조체를 인자로 넘겨주는 것을 볼 수 있다.
핸들 상속 여부는 LPSECURITY_ATTRIBUTES 구조체 내에있는
BOOL bInheritHandle 의 값을 지정하여 결정 할 수 있다.
Pseudo 핸들과 핸들의 중복
6. 커널오브젝트와 오브젝트 핸들에서 자신의 핸들을 얻는 방법으로 GetCurrentProcess 함수를 소개 한적있다.
GetCurrentProcess함수를 통해 얻은 핸들은 실제 핸들 테이블에 있는 핸들 정보가 아니라
현재 실행중인 프로세스를 참조하기 위한 용도로 정의해놓은 상수가 반환되는 가짜 핸들값이다.
그렇기에 CloseHandle 함수도 작동하지 않는다.
다음의 함수는 핸들값을 복제하는 함수이다.
BOOL DuplicateHandle(
HANDLE hSourceProcessHandle, //복제할 핸들을 소유하는 프로세스
HANDLE hSourceHandle, //복제할 핸들
HANDLE hTargetProcessHandle, //복제된 핸들을 소유할 프로세스
LPHANDLE lpTargetHandle, //복제된 핸들값을 저장할 변수의 주소
DWORD dwDesiredAccess, //복제된 핸들의 접근권한
BOOL bInheritHandle, //복제된 핸들의 상속여부
DWORD dwOption //원본 핸들과 동일한 접근권한 등
);
첫번째와 세번째 프로세스를 동일한 프로세스를 인자로 넣어서
핸드 테이블에 2번 들어갈 수 있게 할수도 있으며
위 함수를 통해서 자식 프로세스가 부모 프로세스의 핸들 값을 얻어 올수도 있다.
두번째 인자에 가짜함수를 넣으면 진짜 핸들이 생성되어 핸들테이블에 등록된다.
2. 파이프 방식의 IPC
파이프의 이해
Windows 파이프 메커니즘에는 두가지 종류가 있는데
이름없는 파이프(Anonymous Pipe) 와 이름있는 파이프(Named Pipe) 이다.
메일슬롯과 함께 특징을 정리해보면 다음과 같다.
메일슬롯
브로드캐스트 방식의 단방향 통신
메일슬롯에 할당된 주소기반 통신을 하기때문에 관계없는 프로세스 사이에서도 통신 가능
이름없는 파이프
단반향 통신
파이프를 통해서 생성된 핸들을 기반으로 통신을 하기 때문에 프로세스들 사이에 관계 필요
이름있는 파이프
메일 슬롯과 유사
브로드캐스트 방식이 아닌 양방향 통신 지원
이름없는 파이프(Anonymous Pipe)
BOOL CreatePipe(
PHANDLE hReadPipe, //데이터를 읽는 핸들
PHANDLE hWritePipe, //데이터를 쓰는 핸들
LPSECURITY_ATTRIBUTES lpPopeAttributes, //보안정보 구조체(핸들 상속 여부 등)
DWORD nSize //파이프의 버퍼 사이즈
);
이름있는 파이프(Named Pipe)
HANDLE CreateNamePipe(
LPCTSTR lpName, //파이프 이픔
DWORD dwOpenMode, //읽기,쓰기 모드 지정
DWORD dwPipeMode, //데이터 전송방식, 수신방식, 함수리턴 방식 지정 방법
DWORD nMaxInstances, //생성할 수 있는 최대 파이프 개수
DWORD nOutBufferSize, //출력 버퍼 사이즈
DWORD nInBufferSize, //입력 버퍼 사이즈
DWORD nDefaultTimeOut, //기본 만료 시간
LPSECURITY_ATTRIBUTES lpPopeAttributes //보안정보 구조체(핸들 상속 여부 등)
);
이름있는 파이프의 경우
서버에서 파이프 생성 -> 클라이언트 연결 순으로 진행된다.
알고 넘어가야할 것
1. 핸들 테이블
2. 핸들과 핸들 테이블 관계
3. 핸들의 상속
4. 가짜핸들
5. 파이프
'윤성우 저자'님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍' 책을 보고 정리한 내용입니다.
'IT > 윈도우 시스템 프로그래밍' 카테고리의 다른 글
(윈도우 시스템) 10. 컴퓨터 구조 세번째 (0) | 2021.08.09 |
---|---|
(윈도우 시스템) 9. 스케줄링 알고리즘과 우선순위 (2) | 2021.08.06 |
(윈도우 시스템) 7. 프로세스간 통신(IPC) 1 (0) | 2021.08.02 |
(윈도우 시스템) 6. 커널오브젝트와 오브젝트 핸들 (0) | 2021.07.30 |
(윈도우 시스템) 5. 프로세스 생성과 소멸 (0) | 2021.07.28 |