본문 바로가기

프로그래밍/C

[C언어]리눅스 공유메모리(shared memory) 사용하기

반응형

~

 

Linux내에서 공유메모리를 사용하는 코드입니다.

 

먼저, 공유메모리란 '컴퓨터 환경에서 여러 프로그램이 동시에 접근할 수 있는 메모리'입니다. (출처:위키백과)

 

즉 여러프로그램에서 동시에 접근할 수 있고,

 

같은 컴퓨터에서 동작하는 여러 프로그램간 데이터 통신에 사용하는데,

 

다른 통신이랑 비교하면 통신속도가 '없다'고 말해도 될정도로 빠른 데이터 전송이 가능하죠.

 

사실 데이터 통신이라기보단 같은 메모리를 사용하는거지만요.

 

공유메모리에 대한 더 자세한 내용은 구글에 검색해보시고!

 

저는 리눅스에서 공유메모리를 사용하는 예제를 작성해보겠습니다.

 

~

 

 

~

Read.C 코드

int h_A;       int  *b_A;

 

void CloseUI() {

  if (b_A    != NULL) if( -1 == shmdt( b_A )) printf( "shared memory delete error\n");

  if (h_A    != 0) if( -1 == shmctl( h_A, IPC_RMID, 0)) printf( "shared memory delete error2\n");

}

 

void OpenUI() {

  static int initialized = 0;

  if (initialized == 0) {

   if ( -1 == ( h_A = shmget( (key_t)1100, sizeof(int), IPC_CREAT|0666))) printf( "shared memory open error\n");

   if ( ( void *)-1 == ( b_A = (int*)shmat( h_A, ( void *)0, 0)))           printf( "shared memory open error\n");

    atexit(CloseUI);

    initialized = 1;

  }

}

 

int main(int argc, char *argv[]) {

  OpenUI();

  *b_A=1;

  while(1){

      usleep(1000*1000);

      printf("%d\n",*b_A);

  }

 

}

 

~

 

 

~

Write.C 코드

int h_A;       int  *b_A;

 

void CloseUI() {

  if (b_A    != NULL) if( -1 == shmdt( b_A )) printf( "shared memory delete error\n");

  if (h_A    != 0) if( -1 == shmctl( h_A, IPC_RMID, 0)) printf( "shared memory delete error2\n");

}

 

void OpenUI() {

  static int initialized = 0;

  if (initialized == 0) {

   if ( -1 == ( h_A = shmget( (key_t)1100, sizeof(int), IPC_CREAT|0666))) printf( "shared memory open error\n");

   if ( ( void *)-1 == ( b_A = (int*)shmat( h_A, ( void *)0, 0)))           printf( "shared memory open error\n");

    atexit(CloseUI);

    initialized = 1;

  }

}

 

int main(int argc, char *argv[]) {

  OpenUI();

  while(1){

    scanf("%d",b_A);

  }

}

 

~

 

 

~

코드설명

공유메모리는 '프로그램간 같은 메모리'를 사용하는 것임으로,

2개의 실행파일을 작성하여 테스트를 하였습니다.

'Read'는 공유메모리의 값을 1초 간격으로 출력하는 프로그램이고,

'Write'는 Scanf를 통해 공유메모리의 값을 변경하는 프로그램입니다.

 

 

 

1번 전까지는 Read프로그램에서 1초간격으로 1이 출력되다가,

제가 Write프로그램에서 2를 입력하자(1번 이후) 1초간격으로 2가 출력됩니다.

같은식으로 2번 이후는 476이 1초 간격으로 출력되죠.

 

반응형