공유 메모리 정보 / 변경 shmctl()

OS/리눅스 & 유닉스 2012. 1. 12. 15:01

shmctl() 함수는 공유 메모리에 대한 정보를 구하거나 변경 또는 제거합니다. 공유 메모리에 대한 자세한 내용은 shmget() 함수의 내용을 참고하여 주십시오.

헤더

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

형태 int shmctl(int shmid, int cmd, struct shmid_ds *buf);
인수
int shmid 공유 메모리 식별 번호
int cmd 제어 명령
struct shmid_ds *buf 공유 메모리 정보 구하기 위한 버퍼 포인터 
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) */
     };
반환
-1 실패
0 성공

예제

예제를 위해 두 개의 프로세스를 만들겠습니다. counter.c 는 공유 메모리에 1초 마다  0부터 계속 증가하는 카운터 문자열을 공유 메모리에 넣으면 show_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;
   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( "공유 메모리를 사용하는 프로세스의 개수 : %d\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;
}
]$ gcc main.c
]$ ./a.out
공유 메모리 생성 성공 공유 메모리 첨부 성공 공유 메모리를 사용하는 프로세스의 개수 : 1 공유 메모리 분리 성공 공유 메모리 제거 성공 ]$

[출처] shmctl|작성자 JHoon

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

프로세스 끼리의 통신 UDS  (0) 2012.01.19
inittab  (0) 2012.01.19
vi 명령어 정리  (0) 2012.01.12
vi 에디터 (커서, 화면 제어)  (0) 2012.01.11
vi 에디터 문자열 치환  (0) 2012.01.09
: