본문 바로가기

카테고리 없음

공유 메모리 예제 및 주의점

반응형

자주 쓰이는 함수

 

shmget (shared memory get)
shmat (shared memory attach)
shmdt (shared memory detach)

 

예제

두개의 프로세스를 만들겠습니다. counter.c 라는 예제는 공유메모리에 1초마다 0부터 계속 증가하는 카운터 문자열을 공유메모리에 넣을 예정이구요. show_counter.c에서는 공유메모리를 화면에 출력하겠습니다.

 

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

#define KEY_NUM     9527
#define MEM_SIZE    1024

int main(void) {

    int shm_id;
    void *shm_addr;
    int count;

     if ( -1 == ( shm_id = shmget( (key_t)KEY_NUM, MEM_SIZE, IPC_CREAT|0666))){
        printf("공유메모리 생성 실패\n");
        return -1;
     }

    if ( ( void *)-1 == ( shm_addr = shmat( shm_id, ( void *)0, 0)))
    {
       printf( "공유 메모리 첨부 실패\n");
       return -1;
    }

    count = 0;
   while( 1 )
   {
      sprintf( (char *)shm_addr, "%d", count++);       // 공유 메모리에 카운터 출력
      sleep( 1);
   }

    return 0;
}

주의! 위 코드에서 sprintf로 count에 해당하는 값을 shm_addr에 넣는 것을 볼 수 있다.

그 때 %d, %s, %c등을 잘 써야 원하는 데이터를 정확히 넣을 수 있다 !

 

show_counter.c :

#include <stdio.h>      // printf()
#include <unistd.h>     // sleep()
#include <sys/ipc.h>
#include <sys/shm.h>

#define  KEY_NUM     9527
#define  MEM_SIZE    1024

int main( void)
{
   int   shm_id;
   void *shm_addr;

   if ( -1 == ( shm_id = shmget( (key_t)KEY_NUM, MEM_SIZE, IPC_CREAT|0666)))
   {
      printf( "공유 메모리 생성 실패\n");
      return -1;
   }

   if ( ( void *)-1 == ( shm_addr = shmat( shm_id, ( void *)0, 0)))
   {
      printf( "공유 메모리 첨부 실패\n");
      return -1;
   }

   while( 1 )
   {
      printf( "%s\n", (char *)shm_addr);    // 공유 메모리를 화면에 출력
      sleep( 1);
   }
   return 0;
}

 

 

 

아래는 ipc 관련 명령어이다. 참고로 사용하면 좋다.

 

반응형