IPC (Inter-Process Communication) : 프로세스 사이의 통신
메일 슬롯(Mail Slot)의 원리 :
프로세스는 자신에게 할당된 메모리 공간 이외에는 접근할 수가 없다.
따라서 Mail Slot (우체통)을 이용하여 데이터를 송·수신한다.
데이터를 수신하고자 하는 프로세스 A(Receiver)가 Mail Slot 을 생성한다.
데이터를 송신하고자 하는 프로세스 B(Sender)가 프로세스 A의 Mail Slot 의 주소로 데이터를 송신한다.
프로세스 A가 자신의 Mail Slot 을 통해 데이터를 얻게 된다.
메일 슬롯(Mail Slot) 구성 :
Recevier :
Mail Slot 를 생성한다.
HANDLE CreateMailslot(
LPCTSTR lpName, // 메일슬롯 주소
DWORD nMaxMessageSize, // 메일슬롯의 버퍼 크기
DWORD lReadTimeout, // 최대 블로킹 시간(밀리세컨드 : ms)
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 핸들 상속 여부
};
Mail Slot 에 들어있는 데이터를 읽어온다.
BOOL ReadFile(
HANDLE hFile, // 해당 파일(Mail Slot)에 존재하는 데이터를 읽어들인다
LPCVOID lpBuffer, // 읽어 들인 데이터를 저장할 버퍼 지정
DWORD nNumberOfBytesToWrite, // 읽어 들일 데이터의 최대 크기 지정
LPDWORD lpNumberOfBytesWritten, // 함수 호출 완료 후 읽어 들인 실제 데이터의 크기를 바이트 단위로
얻기 위한 변수의 주소 지정
LPOVERLAPPED lpOverlapped //
);
Sender :
Mail Slot 의 주소를 얻는다.
(예: "\\\\컴퓨터이름\\mailslot\\[path]name", (아스키코드 기반), 로컬컴퓨터 : . (컴퓨터이름))
해당 Mail Slot 과 연결한다.
HANDLE CreateFile(
LPCTSTR lpFileName, // 개방(open)할 파일 이름
DWORD dwDesiredAccess, // 읽기/쓰기 모드를 지정한다.(or (l) 연산으로 결합)
GENERIC_READ : 읽기 모드
GENERIC_WRITE : 쓰기 모드
DWORD dwShareMode, // 파일 공유방식
0 : 다른 프로세스에 절대 공유 불가. 중복 개방 불가
FILE_SHARE_READ : 다른 프로세스에서 동시 읽기 접근 가능
FILE_SHARE_WRITE : 다른 프로세스에서 동기 쓰기 접근 가능
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 보안 속성
DWORD dwCreationDisposition, // 파일의 생성되는 방법을 지정
CREATE_ALWAYS : 항상 새 파일을 생성
CREATE_NEW : 새 파일 생성, 같은 이름의 파일이 존재하면 생성 실패
OPEN_ALWAYS : 기존 파일 개방. 없으면 생성
OPEN_EXISTING : 기존 파일 개방, 존재하지 않으면 함수 호출 실패
TRUNCATE_EXISTING : 기존 파일의 내용 지우고 개방.
DWORD dwFlagsAndAttributes, // 파일의 특성 정보를 설정 (기본적 FILE_ATTRIBUTE_NORMAL 사용)
HANDLE hTemplateFile // 기존에 존재하는 파일과 동일한 특성을 가지는 새 파일을 만들때 사용
);
해당 Mail Slot 에 데이터를 전송한다.
BOOL WriteFile(
HANDLE hFile, // 데이터를 읽어 들일 파일을 지정(Mail Slot)
LPCVOID lpBuffer, // 전송할 데이터가 저장되어 있는 버퍼 지정
DWORD nNumberOfBytesToWrite, // 전송할 데이터 크기를 지정한다
LPDWORD lpNumberOfBytesWritten, // 함수 호출 완료 후 전송된 실제 데이터의 크기를 바이트 단위로
얻기 위한 변수의 주소 지정
LPOVERLAPPED lpOverlapped //
);
메일 슬롯의 특징 :
메일슬롯에 할당된 주소를 기반으로 통신하기 떄문에 관계없는 프로세스들 사이에서도 통신이 가능하다.
(네트워크 연결되어 통신하는 프로세스들이나 부모 자식간의 연관 관계가 없는 프로세스들)
한쪽 방향으로만 메시지를 전달할 수 있다.
(서로 데이터를 주고 받기 위해서는 각각 메일슬롯을 생성해야 한다)
브로드캐스팅(Broadcasting) 방식의 통신을 지원한다.
Sender 는 한번의 메시지 전송으로 여러 Receiver 에게 동일한 메시지를 동시에 전송하는 것이 가능하다.
(예 :
컴퓨터 이름이 와야 하는 부분에 '*' 을 사용하면 네트워크에 연결되어 있는 모든 컴퓨터를 지칭한다.
따라서 모든 컴퓨터에 해당 주소로 생성된 메일슬롯에 동일한 메시지가 전달된다)
'Windows > _System Programming' 카테고리의 다른 글
커널 오브젝트(Kernel Object) - 2 (0) | 2010.02.23 |
---|---|
프로세스간 통신(IPC) - 파이프(Pipe) (0) | 2010.02.11 |
커널 오브젝트(Kernel Object) (2) | 2010.02.11 |
CreateProcess 함수 (0) | 2010.02.10 |
프로세스(Process) 생성 소스 (0) | 2010.02.10 |