프로그래밍/리눅스 프로그래밍

[메모리] share memory 사용법

jinkwon.kim 2018. 4. 17. 22:16
728x90
반응형

1. Shared memory 리란? 

  - IPC(Inter-Process Communication) 의 일종으로 프로세스간 통신 할때 사용한다.


2. 데이터 공유 방식

  - 커널에 생성된 공유 메모리를 통해서 프로세스간 데이터를 공유한다. 

  - 공유된 메모리 영역을 통해서 통신이 가능하다.

  - 단순히 공유 메모리를 point 함으로써 프로세스에서 사용되는 메모리가 증가되지는 않는다. 


3 . shared memory를 사용하기 위해서 필요한 헤더 및 함수 

  1)헤더 

  - #include <sys/ipc.h>

  - #include <sys/shm.h>

  2) 함수

  - int shmget(key_t key, int size, int shmflg)

    => shared memory 생성 또는 가져오는 함수 

  - void *shmat( int shmid, const void *shmaddr, int shmflg )

    => process에 shared memory를 할당하는 함수 

  - int shmdt( const void *shmaddr)

    => process에 할당된 shared memory를 분리하는 함수 

  - int shmctl(int shmid, int cmd, struct shmid_ds *buf)

    => shared memory를 제어하는 함수


4. shared memroy를 사용하기 위한 sample 코드 

 #include <stdio.h>

 #include <stdlib.h>

 #include <sys/ipc.h>

 #include <sys/shm.h>

 #include <string.h>

 #include <unistd.h>


 typedef struct _shm_info{ 

   char         str_ip[40];

   unsigned int int_ip;    

   unsigned int int_id;     

 }SHM_INFOS;               

 

 int main()

 {

   int shmid;                                                                     

   int i;

   SHM_INFOS *shm_info= NULL;

   void *shared_memory = (void *)0;

 

 

   // 1.번 그림의 (1)에 해당, 공유메모리 공간을 가져온다. 없을시 생성

   // shmget 세부사용법은 인터넷 검색 바람 

   shmid = shmget((key_t)3836, sizeof(SHM_INFOS)*SHM_INFO_COUNT, 0666|IPC_CREAT);

 

   if (shmid == -1)

   {

     //이미 공유 메모리가 생성되어 있을 경우,

     // shmget에서 설정한 공유메모리 크기와 이미 생성된 공유메모리의 크기가 같지 않을때 발생

     perror("shmget failed : ");

     exit(0);

   }

 

   // 1번 그림의 (2)에 해당, 공유 메모리를 process와 연결 시킨다.

   shared_memory = shmat(shmid, (void *)0, 0);

   if (shared_memory == (void *)-1)

   {

     perror("shmat failed : ");

     exit(0);

   }

   

   // 공유메모리에 데이터 쓰기  

   shm_info = (SHM_INFOS *)shared_memory;

   while(1)

   {

     for(i=0 ;i < SHM_INFO_COUNT; i++){

       snprintf(shm_info[i].str_ip,sizeof(shm_info[i].str_ip),"1.1.1.%d",i);

       shm_info[i].int_ip =  12891010 +i;

       shm_info[i].int_id =  128 + i;

     }

   }

 }


5. shared memroy를 제거하기 위한 sample 코드


#include <stdio.h>                                                              
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <unistd.h>

typedef struct _shm_info{ 

  char         str_ip[40];

  unsigned int int_ip;    

  unsigned int int_id;     

}SHM_INFOS;   


int main()
{
  int shmid;

  // 1번 그림의 (1)에 해당, 공유메모리 공간을 가져온다.
  shmid = shmget((key_t)3836, sizeof(SHM_INFOS)*SHM_INFO_COUNT, 0666|IPC_CREAT);

  if (shmid == -1)
  {
    perror("shmget failed : ");
    exit(0);
  }
  
  // 가져온 공유 메모리를 제거한다.
  if ( -1 == shmctl( shmid, IPC_RMID, 0))
  {
    printf( "공유 메모리 제거 실패\n");
    return -1;
  }
  else
  {
    printf( "공유 메모리 제거 성공\n");
  }
  return 0;

}

 

728x90
반응형