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;

}










+ Recent posts