SHMGET(2)

이름
shmget - 공유 메모리 세그먼트를 할당한다.

사용법
#include <sys/ipc.h>

#include <sys/shm.h>

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

설명
shmget() 는 key 인자값과 관련된 공유 메모리 세그먼트 식별자를 반환한다. 만일, key 가 IPC_PRIVATE 값을 가지고 있거나 또는 key 가 IPC_PRIVATE 가 아니고, key 와 연계되어 있는 공유메모리 세그먼트가 없다면 PAGE_SIZE 의 배수만큼의 size 를 가지고 있는 새로운 공유 메모리 세그먼트가 만들어진다. IPC_CREAT 는 shmflg 에 명시되어 있다. (즉, shmflg&IPC_CREAT 는 0이 아니다.)

shmflg 의 구성은 다음과 같다:

IPC_CREAT
    새로운 세그먼트를 만든다. 만일 이 플래그가 사용되지 않는다면, shmget() 는 key와 관련된 세그먼트를 찾을 것이며, 사용자가 그 세그먼트와 관련된 shmid 를 받을 허가권이 있는지 알기 위해서 검사한다. 그리고 세그먼트가 파괴되었다는 표시를 하지 않도록 보장한다.

IPC_EXCL
    세그먼트가 존재할경우 실패를 보장하기 위해 IPC_CREAT와 함께 사용된다.

mode_flags (lowest 9 bits)
    소유자, 그룹, 그 외들을 보장하기 위해 허가권을 지정한다. 현재, 실행 허가권은 시스템에 의해 사용되지 않는다.

새로운 세그먼트가 생성된다면, shmflg 의 접근 허가권은 세그먼트에 정의되어 있는 shmid_ds 의 shm_perm 멤버로 복사된다. 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;	/* 생성자의 pid */
	unsigned short	shm_lpid;	/* 마지막으로 작동한 프로세스 pid */
	short	shm_nattch;		/* 현재 접근한 프로세스의 수 */
};

struct ipc_perm
{
  key_t  key;
  ushort uid;   /* 소유자의 euid 와 egid */
  ushort gid;
  ushort cuid;  /* 생성자의 euid 와 egid */
  ushort cgid;
  ushort mode;  /* shmflg의 하위 9비트 */
  ushort seq;   /* 연속 수(sequence number) */
};

게다가, 생성되는 동안 시스템 콜은 시스템 공유 메모리 세그먼트 데이터 구조 shmid_ds 를 다음과 같이 초기화한다.

    shm_perm.cuid 와 shm_perm.uid 는 호출 프로세스의 유효 user-ID로 설정된다.

    shm_perm.cgid 와 shm_perm.gid 는 호출 프로세스의 유효 group-ID로 설정된다.

    shm_perm.mode 의 하위 9비트들은 shmflg 의 하위 9비트들로 설정된다.

    shm_segsz 는 size 값으로 설정된다.

    shm_lpid, shm_nattch, shm_atime 그리고 shm_dtime 는 0 으로 설정된다.

    shm_ctime 는 현재 시간으로 설정된다.

만일 공유 메모리 세그먼트가 이미 존재한다면, 접근 허가권이 조사되며, 파괴도도록 표시되어 있는지 알아보기 위해 검사한다.

SYSTEM CALLS

fork()
    fork() 후에 자식 프로세스는 연결된 공유 메모리 세그먼트들을 상속한다.

exec()
    exec() 후에 연결된 모든 공유 메모리 세그먼트는 분리된다.(파괴되는것이 아니다)

exit()
    exit() 시 연결된 모든 공유 메모리 세그먼트는 분리된다.(파괴되는것이 아니다)

반환값
성공시 유효한 세그먼트 식별자 shmid 가 반환되며, 에러시 -1이 반환된다.

에러
실패시, errno 는 다음중 하나로 설정된다:

EINVAL
    만일 SHMMIN > size, 또는 size > SHMMAX, 또는 size이 세그먼트의 크기보다 크다면 이 에러가 반환된다.

EEXIST
    IPC_CREAT | IPC_EXCL 이 지정되어 있고, 세그먼트가 존재하면 이 에러가 반환된다.

EIDRM
    세그먼트가 파괴나 제거되도록 표시되어 있다면 이 에러가 반환된다.

ENOSPC
    가능한 모든 공유 메모리 id (SHMMNI) 를 가졌거나 요청된 size 의 세그먼트 할당이 시스템 전체 공유 메모리 제한값 (SHMALL) 을 초과할경우 반환된다.

ENOENT
    주어진 key에 해당하는 세그먼트가 존재하지 않고, IPC_CREAT 가 지정되지 않았다면 반환된다.

EACCES
    사용자가 공유 메모리 세그먼트에 대한 접근 허가권이 없을때 반환된다.

ENOMEM
    세그먼트를 위해 할당할 메모리가 없을때 반환된다.

주의
IPC_PRIVATE 는 플레그 필드가 아니라 key_t 타입이다. 이 특별한 값이 key 에 사용된다면, 시스템 콜은 shmflg 의 하위 9비트들외 모든것을 무시한다. 그리고 새 공유 메모리 세그먼트를 생성(성공시)한다.

다음은 shmget 시스템 콜에 영향을 주는 공유 메모리 세그먼트 자원들의 제한값들이다:

SHMALL
    시스템 전체의 공유 메모리 세그먼트 최대 값: 정책 의존적이다.

SHMMAX
    공유 메모리 세그먼트의 최대 크기(바이트수): 수행 의존적이다.(현재 4M)

SHMMIN
    공유 메모리 세그먼트의 최소 크기(바이트수): 수행 의존적이다.( PAGE_SIZE 가 유효한 최소 크기이지만, 현재는 1byte이다.)

SHMMNI
    시스템 전체의 공유 메모리 세그먼트 최대 수: 수행 의존적이다(현재 4096)

수행시 프로세스당 공유 메모리 세그먼트의 특별한 제한은 없다. (SHMSEG)

버그
IPC_PRIVATE 를 사용하면 할당된 공유 메모리 세그먼트를 접근하는 다른 프로세스들을 저지하지 않는다.

파일들 때문에, 프로세스를 위해 공유 메모리 세그먼트에 대한 배타적 접근을 보장하기 위한 방법이 현재는 없다. shmflg 비트에 IPC_CREAT 와 IPC_EXCL 의 지정만이 새 공유 메모리 세그먼트 생성을 보장(성공시)한다. 이것은 세그먼트에 대한 배타적 접근을 나타내는 것은 아니다.

호환
SVr4, SVID. SVr4 문서는 EEXIST 에러 조건을 추가적으로 기술했다. SVr4 와 SVID 문서들은 EIDRM 조건을 기술하지 않았다.

관련 항목
ftok(3), ipc(5), shmctl(2), shmat(2), shmdt(2)

번역
정강훈 <skyeyes@soback.kornet.net> 2000년 5월 16일
한글 Manpage 프로젝트 (http://man.kldp.org) 2005년 2월 13일