Windows IPC - Shared Memory Using DLL(공유 메모리)
Posted 2009/04/24 01:31|
|
|
댓글 하나가 운영자에겐 커다란 힘이 됩니다!
공유 메모리
일반적으로 exe나 DLL안의 전역변수들은 기본적으로 PAGE_WRITECOPY 속성이 지정되기 때문에 쓰기전에 복사본이 만들어진다(Copy-On-Write) 그러므로 A와 B는 둘 다 다른 물리 공간을 사용하게 된다.
하지만 DLL내에 공유 메모리를 만들어 사용하면 서로 다른 2개의 프로세스가 DLL내의 공유 메모리를 사용해서 통신할 수 있다.
DLL 공유 섹션 만드는 방법
#pragma data_seg("SHARED")
char shared_buffer[1024] = {0};
#pragma data_seg()
#pragma comment(linker, "/subsystem:SHARED,RWS")
단점(보안에 취약하다)
DLL은 Kernel Object의 보안속성을 줄수 없으므로 다른 프로세스에서 DLL을 로드하여 데이터를 가로챌수있다.(보안에 상관없는 통신에서 사용해야한다)
--------------------------------- X.dll -------------------------------------
공유 메모리 설정 DLL 파일
구성 파일 : X.h, a.cpp
X.h
// X.h
#include <windows.h>
#ifdef DLLSOURCE
#define DLLAPI __declspec(dllexport)
#else
#define DLLAPI __declspec(dllimport)
#endif
EXTERN_C DLLAPI void Set(int);
EXTERN_C DLLAPI int Get();
//--------------------------------------------------
a.cpp
// a.cpp
#define DLLSOURCE
#include "X.h"
// DLL 안에 공유 메모리를 만들면 이 DLL을 사용하는 모든 프로세스에서
// 공유 할 수 있다.
#pragma data_seg("SHARE")
int x = 0; // 주의! 반드시 초기화된 data만 공유 메모리에
// 들어갈수있다.
#pragma data_seg()
#pragma comment(linker, "/section:SHARE,RWS")
// " "안에 띄여쓰기 하지 마라
void Set(int value)
{
x = value; // 공유 메모리를 변경한다
}
int Get()
{
return x;
}
----------------------- AA.exe ------------------------------
공유메모리에 값을 할당하는 프로그램
#include <windows.h>
#include <stdio.h>
// X.h와 X.lib 복사해 와라
#include "X.h"
#pragma comment(lib, "X.lib")
void main()
{
HANDLE hEvent = CreateEvent(0, 0, 0, "e");
while(1)
{
int n = 0;
printf("숫자를 넣으세요 >>");
scanf("%d", &n);
Set(n); // DLL 안에 있는 공유 메모리에 data를 넣는다
SetEvent(hEvent);
}
}
// X.h와 X.lib는 현재 폴더에 복사해오세요
// X.dll은 c:\\winnt 아래에 복사해두세요
// - BB프로세스와 공유하기 위해
------------------------------ BB.exe ---------------------------------
공유 메모리 값을 출력하는 프로그램
#include <windows.h>
#include <stdio.h>
// X.h와 X.lib 복사해 와라
#include "X.h"
#pragma comment(lib, "X.lib")
// DLL 안에 공유 메모리를 사용한 IPC 기법
void main()
{
HANDLE hEvent = CreateEvent(0, 0, 0, "e");
while(1)
{
WaitForSingleObject(hEvent, INFINITE);
int n = Get();
printf("X 값 : %d\n", n);
}
}
// X.h와 X.lib는 현재 폴더에 복사해오세요
// B를 먼저 실행하고
// A를 실행 해보세요
// A에 값을 넣고 Enter
위의 정보가 도움이 되셨나요? 그렇다면 댓글 하나만 남겨주세요.
댓글 하나가 운영자에겐 커다란 힘이 됩니다!
- Filed under : 프로그래밍/MFC & Win32
- 1 Comment Trackback


hd5535
| 2010/02/08 01:33 | PERMALINK | EDIT | REPLY |잘 읽었습니다 :)
#pragma와 공유섹선에 대해서 많이 궁금했는데
님 글을 읽고 이해가 쏙쏙 되네요