Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>
Docbook 원문

shmget(2)

1장. shmget(2)

공유메모리(:12) 영역을 할당한다.


1.1. 사용법

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

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


1.2. 설명

shmget()은 주어진 인자 key를 접근번호로 하는 공유메모리 공간할당을 커널(:12)에 요청한다. 커널에서 성공적으로 공유메모리 공간을 할당하게 되면 공유메모리를 가르키는 식별자를 리턴하게 된다. 생성될 공유메모리 공간의 크기는 size를 통해서 byte 단위 크기로 지정할 수 있다. 공간의 할당은 shmflg가 IPC_PRIVATE이거나 key 를 가지는 공유메모리영역이 존재하지 않거나, IPC_CREAT가 지정되었을 경우 (shmflg&IPC_CREAT가 0이 아닌)에 이루어진다.

다음은 사용가능한 shmflg값들이다.

IPC_CREAT

새로운 영역을 할당한다. 만약 이 값이 사용되지 않았다면, shmget()은 key로 이미 생성된 접근 가능한 공유메모리 영역이 있는지 확인하고 이에 대한 식별자를 되돌려줄 것이다.

IPC_EXCL

IPC_CREAT와 함께 사용하며 공유메모리 영역이 이미 존재하면 에러를 리턴한다.

mode_flags(하위 9bit)

접근 권한의 지정을 위해서 사용한다. 실행권한은 사용하지 않는다.

만약 새로운 영역이 생성되었다면 shmflg의 권한정보는 영역에 대한 정보가 정의되어 있는 shmid_ds 구조체의 멤버인 shm_perm으로 복사된다. shmid_ds 구조체는 아래와 같이 정의되어 있다.

struct shmid_ds {
    struct ipc_perm shm_perm;    /* operation perms */
    int             shm_segsz;   /* size of segment (bytes) */
    time_t          shm_atime;   /* last attach time */
    time_t          shm_dtime;   /* last detach time */
    time_t          shm_ctime;   /* last change time */
    unsigned short  shm_cpid;    /* pid of creator */
    unsigned short  shm_lpid;    /* pid of last operator */
    short           shm_nattch;  /* no. of current attaches */
};

struct ipc_perm {
    key_t  key;
    ushort uid;   /* owner euid and egid */
    ushort gid;
    ushort cuid;  /* creator euid and egid */
    ushort cgid;
    ushort mode;  /* lower 9 bits of shmflg */
    ushort seq;   /* sequence number */
};
		
만약 공유 메모리 영역이 이미 존재한다면 접근권한은 수정된다.


1.3. 시스템 호출에 대한 반응

fork()

attache된 공유 메모리 공간은 자식 프로세스에게 상속된다.

exec()

exec()가 호출된 후에는 모든 공유 메모리 공간은 detache된다.

exit()

exit()후 모든 공유 메모리 공간은 detache된다 (없어 지지는 않는다).


1.4. 반환값

성공하면 shmid를 반환, 실패하면 -1을 반환한다.


1.5. 에러

EINVAL

공유 영역생성시 너무 작은 공간을 할당 하거나(size < SHMMIN) 너무 큰 공간(size > SHMMAX)을 할당했을 경우

EEXIST

EACCESS

IPC_CREAT | IPC_EXCL 로 생성을 요청했는데, 이미 공유 메모리 영역이 존재하고 있을 경우,

ENOSPC

size만큼의 공간을 할당할 수 없을 경우. 사용가능한 공간은 SHMALL값으로 커널전역적으로 정의되어 있다. (/usr/include/linux/shm.h 참고)

ENOENT

IPC_CREAT를 사용하지 않았는데, 해당 key를 가지는 공유 메모리 영역이 존재 하지 않는 경우

EACCESS

공유 메모리 영역에 대한 접근권한이 주어져 있지 않다.

ENOMEM

이용할 수 있는 커널 메모리가 충분하지 않다.