shmget(2)

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

int shmget(key_t key, size_t size, int shmflg);

  argument key의 값으로 할당한 shared memory의 id를 얻는 함수입니다.

 

return된 shared memory id는 shmat(2)를 이용하여 C언어의 pointer에 메모리를 사용할 수 있도록 attach(또는 assign)하거나 shmdt(2)를 이용하여 attach된 메모리를 detach합니다. 또는 shmctl(2)을 이용하여 shared memory의 할당된 정보를 얻거나 변경 또는 삭제할 수 있습니다. 할당된 메모리의 크기는 size와 같거나 큰 PAGE_SIZE의 배수를 갖습니다.

할당된 메모리는 같은 시스템 내에서만 유효하고 다른 시스템으로는 접근이 불가능합니다. 할당된 메모리는 프로세스가 종료되어도 자동으로 해제되지 않으며, shmctl(2)을 통하여 삭제하거나, OS가 reboot되면 초기화됩니다.

 

 

파라미터

key
    - key는 ftok(3)함수를 통해서 생성된 값이나, 또는 임의의 숫자를 사용할 수 있습니다.
    - 같은 key로 이미 할당된 값이 있다면, shared memory를 새로 할당하지 않습니다.
    - 만약 key를 IPC_PRIVATE로 설정한다면, key값은 중복되지 않는 임의의 값으로 자동으로 생성됩니다.
    - IPC_PRIVATE로 설정되면 return된 shared memory id를 다른 프로세스에서는 알 수 없으므로 
      shared memory id를 공유할 방법을 제공해야 합니다. (예를들면, 정해진 파일로 공유한다든지...)
size
    - 할당할 메모리의 byte 단위의 크기. 
    - 실제로 할당되는 메모리의 크기는 size가 PAGE_SIZE의 배수이면 size만큼 할당되고,
      그렇지 않으면 size보다 크면서 가장 작은 크기의 PAGE_SIZE의 배수를 갖습니다.
shmflg
    - shmflg는 shared memory에 대한 설정값으로 IPC_CREAT, IPC_EXCL, 
      access권한 9 bit의 bit or 연산으로 설정합니다.

open(2)/create(2)함수의 생성권한처럼 9bit - 8진수 3자리(0666) 
     또는 S_IRUSR, S_IWUSR, S_IRGRP, S_IWGRP, S_IROTH, S_IWOTH의 bit or 연산으로 
     shared memory에 대한 접근 권한과 IPC_CREAT, IPC_EXCL의 bit or 연산으로 설정합니다.

  S_IRUSR, S_IWUSR : 프로세스의 effective uid에 대한 권한 
  S_IRGRP, S_IWGRP : 프로세스의 effective gid에 대한 권한 
  S_IROTH, S_IWOTH : 프로세스의 다른 user에 대한 권한을 설정함

IPC_CREAT : open(2)함수의 O_CREAT와 비슷하게 shared memory를 생성합니다. 
IPC_EXCL  : open(2)함수의 O_EXCL과 비슷한 기능으로 key로 생성된 shared memory segment가 없는 경우에만 생성하고, 
            이미 같은 key로 shared memory가 생성되어 있다면 EEXIST 오류가 발생합니다.

만약 IPC_CREAT와 IPC_EXCL이 bit or에 둘 다 포함되어 있지 않다면, 
이미 만들어진 shared memory에 대한 shared memory id를 return 합니다.

 

RETURN

양수
    -  유효한 shared memory id를 return 합니다.

-1
    - 오류가 발생하였으며, 상세한 오류는 errno에 설정됩니다.

 EACCES : 프로세스의 user가 접근 권한이 없습니다.
 EEXIST : shmflag에 IPC_CREAT | IPC_EXCL option이 추가되었으며, 
          key로 이미 생성된 shared memory segment가 존재합니다.
 EINVAL : size < SHMMIN 이거나 size > SHMMAX이거나 이미 만들어진 
          shared memory segment보다 size가 큰 경우에 발생합니다.
 ENFILE : open할 수 있는 file의 갯수가 시스템 한계에 도달한 경우.
 ENOENT : IPC_CREAT가 shmdflag에 설정되지 않았고, 
          key로 생성된 shared memory segment가 없는 경우
 ENOMEM : 메모리가 부족합니다.
 ENOSPC : System에서 정의한 최대 segment 갯수(SHMMNI)에 도달했거나, 
          할당된 shared memory의 양이 시스템에서 정의한 최대(SHMALL)에 도달하여 Space가 없습니다.

 


활용 예제

 

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

......

int main(int argc, char **argv)
{
    int     shmid;
    int     mem_size;
    key_t   shm_key;
    struct  my_data_t *shm_data;

    ......

    /* shared memory용 IPC key를 생성함 */
    if((shm_key = ftok("~/mywork", 'H')) == -1) {
        perror("shared memory key 생성 오류");
        return 1;
    }

    mem_sie = sizeof(struct my_data_t) * 1000;
    shmid = shmget((key_t)shm_key, mem_size, 0600 | IPC_CREAT);
    
    if (shmid == -1) {
        perror("shmget failed ");
        return 1;
    }

    /* 생성된 shared memroy를 참조함 */
    shm_data = shmat(shmid, (void *)0, 0);

    if (shm_data == (void *)-1) {
        perror("shmat failed ");
        return 1;
    }

    ......

    return 0;
}

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요