IPC : Inter-Process Communication 즉 프로세스 사이의 통신이다.
통신하고자 하는 프로세스가 만날 수 있는 여건
공유하는 메모리 영역이 허락되면 프로세스간 통신은 아주 쉬워진다. 그러나 프로세스들은 서로 만나서 데이터를 주고 받는것이 불가능하다. 각 프로세스는 자신에게 할당된 메모리 이외에는 접근이 불가능하기 때문이다.
운영체제는 프로세스가 자신에게 할당된 메모리 공간 이외의 영역에 접근하는것을 허용하지 않는다. 프로세스가 할당된 메모리 공간 이외의 다른 프로세스 영역에 접근할 수 있다면 여러 프로세스를 실행시켰을때 문제가 발생할 것이다. 이렇게 제한을 하는 이유는 안전성을 높이기 위해서 이다.
메일 슬롯 방식의 IPC
Windows에서는 다양한 IPC 기법을 제공한다. 그중 메일 슬롯 기반의 IPC도 있다.
메일슬롯(Mail Slot)원리
메일슬롯은 편지를 넣을 수 있는 가느다란 우체통의 입구를 의미한다. 메일 슬롯의 기본 원리는 "데이터를 주고받기 위해 프로세스가 우체통을 마련하는 것"이다.
데이터를 보내는 프로세스를 Sender라하고 데이터를 받는 프로세스를 Receiver라고 한다. Receiver는 밖에 메일슬롯이라고 하는 우체통을 하나 걸어둔다. Sender는 Receiver의 주소를 통해서 Receiver의 메일슬롯에 데이터를 날린다. 그러면 Receiver는 메일슬롯을 통해 데이터를 얻는다.
Receiver 프로세스는 CreateMailSlot 함수를 통해 우체통을 생성해야 한다.
CreateMailSlot함수
HANDLE CreateMailslot(
LPCTSTR lpName,
DWORD nMaxMessageSize,
DWORD lReadTimeout,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
위 함수는 Mailslot의 핸들값을 반환한다.
첫번째 인자는 생성하는 메일 슬롯의 이름을 결정하는데 사용된다. 즉 주소(경로)를 지정하는 것이다.
ex)\\computername\mailslot\[path]name
두번째 인자는 메일 슬롯의 버퍼크기를 지정하는데 사용된다.
만약에 0이 전달될 경우 시스템이 허용하는 최대크기로 지정된다.
세번째인자인 lReadTimeout은 메일슬롯으로부터 읽어들일 데이터가 있다면 이 데이터들을 읽어들일때까지 ReadFile함수를 사용한다. 메일 슬롯이 비어있다면 데이터가 채워질 때까지 ReadFile함수는 반환하지 않고 블로킹 상태에 놓이게 된다.
lReadTimeout은 최대 블로킹시간을 밀리세컨드 단위로 지정하는데 사용된다.
lpSecurityAttributes : 핸들을 상속하기 위한 용도
메일슬롯을 통한 데이터 통신을 하기 위해서 Sender는 Receiver가 만들어 놓은 메일슬롯의 이름(경로)을 알아야 한다.
Sender는 CreateFile함수와 메일 슬롯 이름을 통해 데이터를 보내기 위한 데이터 스트림을 개방하고, 해당 스트림에 WriteFile함수를 통해 데이터를 전송한다.
Receiver는 ReadFile함수를 통해서 Mailslot에 전송된 데이터를 읽어들인다.
ReadFile 함수
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
hFile : 메일슬롯의 핸들을 인자로 넣으면, 메일슬롯에 존재하는 데이터를 읽어들인다.
lpBuffer : 읽어들인 데이터를 저장할 버퍼를 지정하는 용도로 쓰인다.
nNumberOfBytesToread : 함수 호출이 완료된 이후에, 읽어들인 데이터 크기를 바이트 단위로 얻기위한 변수를 지정한다.
lpOverlapped : 일반적으로 NULL을 전달한다. 중첩된(overlapped) I/O 에서 사용됨
WriteFile 함수
BOOL WriteFile(
HANDLE hFile.
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);
hFile : 데이터를 읽어들일 파일을 설정한다.(데이터를 받을 파일)
lpBuffer : 전송할 데이터가 저장되어 있는 버퍼
nNumberOfBytesToWrite : 전송할 데이터 크기를 지정한다.
lpNumberOfBytesWritten : 함수호출 완료 후 전송된 실제 데이터의 크기를 바이트 단위로 얻기위한 변수의 주소 지정
Mailslot의 특징
Mailslot의 경우 Sender에서 Receiver로만 메시지를 전송하는 단방향 통신만 가능하다. 메일 슬롯은 한쪽 방향, 메일슬롯이 설치되어 있는 방향으로만 메시지를 전달할 수 있기 때문에 채팅 프로그램을 구현하기 위해서는 두개의 메일 슬롯을 생성해야만 한다.
또한 메일 슬롯은 브로드캐스팅(Broad casting)방식의 통신을 지원한다. 즉, 하나의 Sender는 한번의 메시지 전송으로 여러 Receiver에게 동일한 메시지를 동시에 전송하는 것이 가능하다.
메일 슬롯은 생성과 동시에 Usage Count가 1이다. 메일슬롯을 참조하는 프로세스는 메일슬롯을 생성한 프로세스 하나 뿐이기 때문이다. 메일 슬롯 뿐만아니라, 프로세스와 쓰레드를 제외한 다른 모든 커널 오브젝트는 생성과 동시에 Usage Count가 1이된다.
'Programming > Windows System Programming' 카테고리의 다른 글
프로세스 환경변수 (0) | 2020.07.11 |
---|---|
Signaled vs Non-Signaled (0) | 2020.07.11 |
CloseHandle 함수와 프로세스 종료코드 (0) | 2020.06.13 |
커널 오브젝트에 대한 이해 2 (0) | 2020.06.13 |
커널 오브젝트에 대한 이해 (0) | 2020.06.10 |