반응형
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;
}
반응형
'C언어 header > sys | shm.h' 카테고리의 다른 글
shmdt(2) - System V IPC shared memory의 pointer를 detach. (0) | 2019.09.29 |
---|---|
shmat(2) - System V shared memory segment를 pointer로 지정하기 (0) | 2019.09.29 |
shmctl(2) - System V shared memory 제어하기 (0) | 2019.09.29 |