* 하나의 프로세스가 하나의 프로그램이라는 생각을 할 수 있는데, 하나의 프로그램이 여러 프로세스로 형성될 수 있다.
이는 여러 프로세스 간의 통신이 이뤄져야 함을 뜻한다.
IPC
* 프로세스간 통신
- 프로세스간 데이터 송/수신 → 메모리 공유
- 데이터를 주고 받는 행위는 공유되어지는 메모리 공간을 생성하는 것과 같음
ex) 프로세스 A, B의 메모리 영역은 완전히 분리되어 있음
프로세스 A 영역 | 프로세스 B 영역 |
Data 영역 | Data 영역 |
Heap 영역 | Heap 영역 |
Stack 영역 | Stack 영역 |
- OS는 안정성의 이유로 프로세스간의 메모리 영역에 접근하는 것을 막고 있기에 분리되었다고 볼 수 있음
- 이에 대한 해결책으로써 IPC를 제공함
메일슬롯
* 동작 원리
- 메일 슬롯은 우체통의 원리와 유사함
- Sender 프로세스(주고 싶은 프로세스), Receiver 프로세스(받고 싶은 프로세스)
1) Receiver 프로세스는 데이터를 받기로 선언함(함수 호출을 통해 간접적으로)
2) OS는 우체통(메일슬롯)을 Receiver에게 제공함(주소 부여 - 메모리 공유)
3) Sender 프로세스는 메일슬롯의 주소를 통해서 데이터를 전송 - 단방향 특성
cf) 여러 프로세스가 동일한 주소의 우체통을 통해서 Sender프로세스의 데이터를 공유받을 수 있음 - 방송(Broadcast)
* 프로그래밍 모델
Receiver | Sender | |
우체통 생성 (CreateMailSlot) |
연결(CreateFile) | |
수신: ReadFile | ←가능 | 전송: WriteFile |
전송: WriteFile | 불가능→ | 수신: ReadFile |
- 파일 시스템을 기반으로 하고 있음을 함수 이름을 통해 알 수 있음
#include <tchar.h>
#include <Windows.h>
#define SLOT_NAME _T("\\\\.\\mailslot\\mailbox")
int _tmain(int argc, LPTSTR argv[])
{
// 메일슬롯 Receiver
HANDLE hMailSlot; // mailslot 핸들
TCHAR messageBox[50];
hMailSlot = CreateMailslot(
SLOT_NAME, // 슬롯 이름
0, // 메일 슬롯 버퍼크기, 0은 허용최대치
MAILSLOT_WAIT_FOREVER, // ReadFile 함수 특성
NULL); // 보안설정
ReadFile(
hMailSlot, // 슬롯 지정
messageBox, // 데이터 수신버퍼(배열지정)
sizeof(TCHAR) * 50, // 읽어 들일 데이터 최대크기
&bytesRead, // 읽어 드린 데이터 크기 얻기 위해
NULL); // 일단 NULL
// 더 이상 메일슬롯이 필요없게 되면 UC 카운터를 줄이는 함수 실행
CloseHandle(hMailSlot);
// 메일 슬롯 Sender
HANDLE hMailSlotSender;
hMailSlotSender = CreateFile(
SLOT_NAME, // 연결슬롯 이름
GENERIC_WRITE, // 메일슬롯 용도
FILE_SHARE_READ,
NULL,
OPEN_EXISTING, // 생성 방식
FILE_ATTRIBUTE_NORMAL,
NULL);
WriteFile(
hMailSlotSender,
messageBox, // 전송데이터 버퍼
_tcslen(messageBox) * sizeof(TCHAR), // 전송 크기
&bytesWritten, // 전송 결과
NULL);
CloseHandle(hMailSlotSender);
}
'시스템 프로그래밍' 카테고리의 다른 글
8-1. 프로세스 환경변수 (0) | 2022.05.20 |
---|---|
7-2. Signaled & Non-Signaled (0) | 2022.05.17 |
6-2. 커널 오브젝트와 핸들의 종속관계 (0) | 2022.05.14 |
6-1. 커널 오브젝트에 대한 이해 (0) | 2022.05.13 |
5-2. 프로그래밍을 통한 프로세스의 생성 (0) | 2022.05.13 |