태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.


댓글 하나가 운영자에겐 커다란 힘이 됩니다!

공유 메모리 

일반적으로 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

위의 정보가 도움이 되셨나요? 그렇다면 댓글 하나만 남겨주세요.
댓글 하나가 운영자에겐 커다란 힘이 됩니다!

  1. hd5535

    | 2010/02/08 01:33 | PERMALINK | EDIT | REPLY |

    잘 읽었습니다 :)
    #pragma와 공유섹선에 대해서 많이 궁금했는데
    님 글을 읽고 이해가 쏙쏙 되네요

Write your message and submit
« PREV : 1 : ... 62 : 63 : 64 : 65 : 66 : 67 : 68 : 69 : 70 : ... 442 : NEXT »