SMALL
IPC(Inter-Process Communication)이란 영어 번역 그대로 프로세스간 통신을 말한다.
동일한 바이너리를 실행해도 전혀 다른 메모리를 사용하면서 서로 침범할 수 없다.
하지만 프로세스끼리 통신을 하기 위해서 여러가지 방법이 존재한다.
그 중 이번에 알아볼 내용은 메모리의 공유를 이용한 방법이다.
FILE MAPPING을 이용하여서 메모리를 공유를 할 것이다. 그럼 FILE_MAPPING이란 무엇인가?
FILE MAPPING이란 파일을 메모리에 연결하여 메모리에 입출력을 하면, 디스크와 직접 연결되어 있어
디스크에도 입출력이 이루어지는 기능을 말한다. [참고1]이를 잘 나타낸 그림이 MS에 나와 있어 가져왔다.
즉 하나의 메모리 조각을 같이 공유 함으로써, 데이터를 공유 할 수 있는 것이다.
해당 내용을 확인 할 수있는 코드이다.
#include "windows.h"
#include "stdio.h"
int main()
{
HANDLE hShared_Mem = NULL;
char* pData = NULL; // 공유 메모리 Addr 저장 변수
int num = 0; //switch 선택
//공유 메모리가 존재하는지 확인
hShared_Mem = OpenFileMapping(FILE_MAP_ALL_ACCESS, NULL, "richong_Shared_Mem");
//존재 할 경우 루틴
if (hShared_Mem != NULL){
printf_s("Find_Shared Mem\n");
}
//존재 하지 않을 경우 공유 메모리를 생성
else
{
printf_s("not existing Shared Mem\n");
printf_s("Creating Shared Mem\n");
hShared_Mem = CreateFileMapping(INVALID_HANDLE_VALUE
, NULL
, PAGE_READWRITE
, 0
, 1024
, "richong_Shared_Mem");
if (hShared_Mem != NULL){
printf_s("Shared Mem Create Success\n");
}
else{
printf_s("Fail to create Shared Mem,Exit\n");
return 0;
}
}
//공유 메모리의 주소 얻어 옴
pData = (char*)MapViewOfFile(hShared_Mem,
FILE_MAP_ALL_ACCESS,
0,
0,
1024);
do
{
printf_s("Select 1.store , 2.laod 3. Delete \n ");
scanf_s("%d", &num);
fflush(stdin);
switch (num)
{
case 1:
printf_s("Input store string :");
char tmp_Input_string[1024];
scanf_s("%s", tmp_Input_string);
strcpy_s(pData,1024,tmp_Input_string);
break;
case 2:
printf_s("Load Shared Data :");
printf_s("%s\n", pData);
system("pause");
system("cls");
break;
case 3:
if (pData != NULL)
UnmapViewOfFile(pData);
if (hShared_Mem != NULL)
CloseHandle(hShared_Mem);
return 0;
break;
default:
printf_s("Select only 1, 2 plz.\n");
break;
}
} while (1);
}
ㅅ
P1이 공유 메모리에 "12345"데이터를 기록하고
P2는 공유 메모리에 있는 데이터를 가져온다.
[참고1]http://egloos.zum.com/anster/v/2156072
LIST
'학부_대학원 > 운영체제' 카테고리의 다른 글
| Interrupt 인터럽트 (0) | 2016.10.22 |
|---|---|
| 캐시[Cache]란? (0) | 2016.08.10 |
| 동기화 vs 비동기화 (0) | 2016.08.10 |
| System Bus[버스란?] (0) | 2016.08.08 |
| 캐시 쓰기 정책 (0) | 2016.08.04 |