C언어 공유 메모리를 프로세스에서 분리 함수 shmdt()

2020. 3. 16. 08:10 컴퓨터/프로그래밍

C함수 공유 메모리를 프로세스에서 분리 shmdt()

shmdt() 함수는 프로세스에 첨부된 공유 메모리를 프로세스에서 분리합니다.

  • 헤더: sys/type.h, sys/shm.h
  • 형태: int shmdt(const void *shmaddr)
  • 인수: void *shmaddr 분리할 공유 메모리 주소
  • 반환: int 0 == 성공, -1 == 실패

공유 메모리는 단어 뜻에서 알 수 있듯이 하나의 프로세스에서가 아니라 여러 프로세스가 함께 사용하는 메모리를 말합니다. 이 공유 메모리를 이용하면 프로세스끼리 통신을 할 수 있으며, 같은 데이터를 공유할 수 있습니다.

이렇게 같은 메모리 영역을 공유하기 위해서는 공유 메모리를 생성한 후에 프로세스의 자신의 영역에 첨부를 한 후에 마치 자신의 메모리를 사용하듯 사용합니다.

즉, 공유 메모리를 사용하기 위해서는 공유 메모리를 생성한 후에, 이 메모리가 필요한 프로세스는 필요할 때 마다 자신의 프로세스에 첨부를 한 후에 자기 메모리를 사용하듯 사용하면 됩니다.

예제

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

// 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;
   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;
}
// show_counter.c   counter.c가 공유 메모리에 넣는
// 카운터 문자열을 화면에 계속 출력합니다.

#include <stdio.h>      // printf()
#include <unistd.h>     // sleep()
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.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;
   }
   while( 1 ){
      if ( ( void *)-1 == ( shm_addr = shmat( shm_id, ( void *)0, 0))){
         printf( "공유 메모리 첨부 실패\n");
         return -1;
      } else {
         printf( "공유 메모리 첨부 성공\n");
      }
      printf( "%s\n", (char *)shm_addr);
      if ( -1 == shmdt( shm_addr)){
         printf( "공유 메모리 분리 실패\n");
         return -1;
      } else {
         printf( "공유 메모리 분리 성공\n");
      }
      sleep( 1);
   }
   return 0;
}

실행 결과

counter show counter
]$ gcc counter.c -o counter.out
]$ ./counter.out
]$ gcc show_counter.c -o show_counter.out
]$ ./show_counter.out
공유 메모리 첨부 성공
0
공유 메모리 분리 성공
공유 메모리 첨부 성공
1
공유 메모리 분리 성공
공유 메모리 첨부 성공
2
공유 메모리 분리 성공
공유 메모리 첨부 성공
3
공유 메모리 분리 성공
공유 메모리 첨부 성공
4
공유 메모리 분리 성공
공유 메모리 첨부 성공
5
공유 메모리 분리 성공
공유 메모리 첨부 성공
5
공유 메모리 분리 성공
공유 메모리 첨부 성공
5
공유 메모리 분리 성공
이 댓글을 비밀 댓글로