IPC(interprocessor communication)
하나의 프로그램에서 여러게의 프로세스를 형성 할 수있다.
프로세스간 통신
프로세스간 데이터 송 수신→메모리 공유
A에서 B로 주고 받는다는 느낌보다는 메모리 공유 기법에서 이루어진다.
process A ------[memory]--------process B
각 프로세스의 메모리영역이 분리 되어있고 그 범위를 벗어날 수 없기때문에 프로세스들은 직접 서로 데이터를 주고 받을 수 없다.
다른 프로세스의 메모리에 접근은 안전성을 위해서 막혀있다.
[출일슬롯 방식의 IPC|작성자 F
메일슬롯(Mail Slot)
Receiver process<----- Receiver's Mail slot <------- Sender process
데이터를 받기 위해서 프로세스는 접근가능한 공간이 필요하다. 그렇기에 OS는 메일슬롯을 생성하고 받는프로세서는 함수호출을 통한 간접적 방법으로 이 영역에 접근이 가능하다. 그리고 이 영역에 주소를 할당하여 데이터를 전송하는 프로세스는 이 주소를 통하여 데이터를 전송한다.
우체통에 편지를 보내서 받는 개념이다.
그렇게 때문에 양방향성의 통신이 아니라 단방향 통신이다.
Process A <-------- A Mail slot <------------
Process B <-------- A Mail slot <------------ Sender Process
Process C <-------- A Mail slot <------------
현실에서는 우체통 마다 다른 주소를 같지만 윈도우즈에서는 메일슬롯의 주소가 같을 수 도 있고 또한 데이터를 보내는 프로세스가 한번의 보내기를 통하여 각각의 프로세스에 모두 전달 할 수 있다.
Receiver 가 우체통을 생성하면 Sender 는 우체통에 접근하기위하여 연결을 하기 위해 어떻한 함수를 호출하는데 이런 연결과정을 거친후에 데이터를 전송 할 수 있다.
위에서 한번 나왔듯이 Receiver에서의 데이터 전송은 가능하지 않다.
잘 보면 여기서 사용하는 함수들이 파일 관련함수들이다.
A 가 파일을 생성하여 데이터 작성 --> B가 파일을 읽어서 데이터 받음
이런식의 파일을 이용한 단순하고 불안정한 통신이 가능한데
실제로 메일슬롯 방식이 이러한 방식을 기반으로 만들어졌기 때문에 파일관련함수를 사용한다.
예제
메일슬롯 Receiver
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#define SLOT_NAME _T("\\\\.\\mailslot\\mailbox")//이곳에 컴퓨터 이름이 들어간다.
/*이 주소를 이용하여 분리된 컴퓨터간에서 프로세스간 통신가능 하지만 실제로는 거의 이용되지 않는다*/
int _tmain(int argc, LPTSTR argv[])
{
HANDLE hMailSlot; //mailslot 핸들
TCHAR messageBox[50];
DWORD bytesRead; // number of bytes read
/* mailslot 생성 */
hMailSlot=CreateMailslot(
SLOT_NAME,
0, //메일슬롯 버퍼크기
MAILSLOT_WAIT_FOREVER,
NULL);
if(hMailSlot==INVALID_HANDLE_VALUE)
{
_fputts(_T("Unable to create mailslot!\n"), stdout);
return 1;
}
/* Message 수신 */
_fputts(_T("******** Message ********\n"), stdout);
while(1)
{
if(!ReadFile(hMailSlot, messageBox, sizeof(TCHAR)*50, &bytesRead, NULL))
{
_fputts(_T("Unable to read!"), stdout);
CloseHandle(hMailSlot);
return 1;
}
if(!_tcsncmp(messageBox, _T("exit"), 4))
{
_fputts(_T("Good Bye!"), stdout);
break;
}
messageBox[bytesRead/sizeof(TCHAR)]=0; //NULL 문자 삽입.
_fputts(messageBox, stdout);
}
CloseHandle(hMailSlot);
return 0;
}
-----------------------------------------------------------------------------------
메일슬롯 Sender
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#define SLOT_NAME _T("\\\\.\\mailslot\\mailbox")
int _tmain(int argc, LPTSTR argv[])
{
HANDLE hMailSlot; //mailslot 핸들
TCHAR message[50];
DWORD bytesWritten; // number of bytes write
hMailSlot=CreateFile(SLOT_NAME, GENERIC_WRITE, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hMailSlot==INVALID_HANDLE_VALUE)
{
_fputts(_T("Unable to create mailslot!\n"), stdout);
return 1;
}
while(1)
{
_fputts(_T("MY CMD>"), stdout);
_fgetts(message, sizeof(message)/sizeof(TCHAR), stdin);
if(!WriteFile(hMailSlot, message, _tcslen(message)*sizeof(TCHAR), &bytesWritten, NULL))
{
_fputts(_T("Unable to write!"), stdout);
CloseHandle(hMailSlot);
return 1;
}
if(!_tcscmp(message, _T("exit")))
{
_fputts(_T("Good Bye!"), stdout);
break;
}
}
CloseHandle(hMailSlot);
return 0;
}
'강좌 정리 > 뇌를자극하는윈도우즈시스템프로그래밍' 카테고리의 다른 글
08장. 프로세스간 통신(IPC) 2 ①핸들 테이블과 오브젝트 핸들의 상속 (0) | 2012.08.17 |
---|---|
07장. 프로세스간 통신(IPC) Signaled vs Non-Signaled (0) | 2012.08.10 |
06장. 커널 오브젝트와 오브젝트 핸들 ②커널 오브젝트와 핸들의 종속관계 (0) | 2012.07.09 |
06장. 커널 오브젝트와 오브젝트 핸들 ① 커널 오브젝트에 대한 이해 (0) | 2012.07.05 |
05장. 프로세스의 생성과 소멸 ②프로그래밍을 통한 프로세스의 생성 (0) | 2012.07.04 |