C언어 공유 메모리 정보 확인·변경·제거 함수 shmctl()

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

C함수 공유 메모리 정보 확인·변경·제거 shmctl()

shmctl() 함수는 공유 메모리에 대한 정보를 구하거나 변경 또는 제거합니다.

  • 헤더: sys/ipc.h, sys/shm.h
  • 형태: int shmctl(int shmid, int cmd, struct shmid_ds *buf)
  • 인수: int shmid 공유 메모리 식별 번호
    int 제어 명령
    struct shmid_ds *buf 공유 메모리 정보 구하기 위한 버퍼 포인터
  • 반환: int 0 == 성공, -1 == 실패
reference

3번째 인수 struct shmid_ds 구조는 아래와 같습니다.

struct shmid_ds {
  struct    ipc_perm shm_perm;  /* 접근권한 */
  int  shm_segsz;               /* 세그먼트의 크기(bytes) */
  time_t    shm_atime;          /* 마지막 접근 시간 */
  time_t    shm_dtime;          /* 마지막 제거 시간 */
  time_t    shm_ctime;          /* 마지막 변경 시간 */
  unsigned short shm_cpid;      /* 생성자의 프로세스의 프로세스 id */
  unsigned short shm_lpid;      /* 마지막으로 작동한 프로세스의 프로세스 pid */
  short     shm_nattch;         /* 현재 접근한 프로세스의 수 */
  /* 다음은 개별적이다 */
  unsigned short   shm_npages;  /* 세그먼트의 크기(pages) */
  unsigned long   *shm_pages;
  struct shm_desc *attaches;    /* 접근을 위한 기술자들 */
  };

shm_perm 멤버의 필드들은 아래와 같이 설정할 수 있습니다.

struct ipc_perm{
       key_t  key;
       ushort uid;              /* owner의 euid 와 egid */
       ushort gid;
       ushort cuid;             /* 생성자의 euid 와 egid */
       ushort cgid;
       ushort mode;             /* 접근 모드의 하위 9 bits */
       ushort seq;              /* 연속 수(sequence number) */
     };

예제

#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;
   struct shmid_ds   shm_info;

   if ( -1 == ( shm_id = shmget( (key_t)KEY_NUM, MEM_SIZE, IPC_CREAT¦0666))){
      printf( "공유 메모리 생성 실패\n");
      return -1;
   } else {
      printf( "공유 메모리 생성 성공\n");
   }
   if ( ( void *)-1 == ( shm_addr = shmat( shm_id, ( void *)0, 0))){
      printf( "공유 메모리 첨부 실패\n");
      return -1;
   } else {
      printf( "공유 메모리 첨부 성공\n");
   }
   if ( -1 == shmctl( shm_id, IPC_STAT, &shm_info)){
      printf( "공유 메모리 정보 구하기에 실패했습니다.\n");
      return -1;
   }
   printf( "공유 메모리를 사용하는 프로세스의 개수 : %ld\n", shm_info.shm_nattch);

   if ( -1 == shmdt( shm_addr)){
      printf( "공유 메모리 분리 실패\n");
      return -1;
   } else {
      printf( "공유 메모리 분리 성공\n");
   }
   if ( -1 == shmctl( shm_id, IPC_RMID, 0)){
      printf( "공유 메모리 제거 실패\n");
      return -1;
   } else {
      printf( "공유 메모리 제거 성공\n");
   }
   return 0;
}

실행 결과

]$ ./a.out
공유 메모리 생성 성공
공유 메모리 첨부 성공
공유 메모리를 사용하는 프로세스의 개수 : 1
공유 메모리 분리 성공
공유 메모리 제거 성공
]$
이 댓글을 비밀 댓글로