시스템 프로그래밍

7-1. 프로세스간 통신(IPC)

CalebHong 2022. 5. 17. 10:58

* 하나의 프로세스가 하나의 프로그램이라는 생각을 할 수 있는데, 하나의 프로그램이 여러 프로세스로 형성될 수 있다.

이는 여러 프로세스 간의 통신이 이뤄져야 함을 뜻한다.

 

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);
}