SEMGET(2)

이름
semget - 세마포어 집합 식별자를 얻어낸다.

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

int semget ( key_t key, int nsems, int semflg )

설명
이 함수는 key 의 값에 대응하는 세마포어 집합 식별자를 반환한다. key 의 값이 IPC_PRIVATE 일 경우, 또는 key 의 값이 IPC_PRIVATE 는 아니지만 key 에 대응하는 세마포어 집합이 없을 경우, 또는 semflg 이 IPC_CREAT 을 포함할 경우, 즉, semflg 과 IPC_CREAT 의 AND연산이 0이 아닐 경우에 함수는 nsems 개의 세마포어를 갖는 새로운 집합을 만든다. semflg 에 IPC_CREAT 와 IPC_EXCL 가 동시에 켜져 있는 것은, open(2) 함수 의 mode 인수에 IPC_CREAT 와 IPC_EXCL 가 동시에 설정되어 있을 때와 동일한 역할을 한다. 즉, semflag 에 IPC_CREAT 와 IPC_EXCL 가 동시에 설정되어 있고, key 에 해당하는 세마포어가 이미 존재할 때 함수는 실패한다.

세마포어 생성시, 인수 semflg 의 낮은 9비트는 세마포어 집합에 대한 접근 권한을 정의한다. 접근 권한의 형식은 open (2) creat (2) 시스템 호출의 접근권한 설정시와 동일하다. 단, 실행 허가는 시스템에 의해 주어지지 않으며, 세마포어 집합에 대한 쓰기권한은 실질적으론 변경권한을 의미한다.

게다가 생성시 시스템 호출은 시스템 세마포어 집합의 데이타 구조 semid_ds 를 다음과 같이 초기화한다:

    sem_perm.cuid 와 sem_perm.uid 는 호출한 프로세스의 유효 사용자-ID로 설정된다.

    sem_perm.cgid 와 sem_perm.gid 는 호출한 프로세스의 유효 그룹-ID로 설정된다.

    sem_perm.mode 의 가장 낮은 9비트는 semflg 의 가장 낮은 9비트로 설정된다.

    sem_nsems 는 nsems 의 값으로 설정된다.

    sem_otime 는 0으로 설정된다.

    sem_ctime 는 현재시각으로 설정된다.

인수 nsems 는 시스템호출이 집합을 생성하지 않을 경우에는 0 일 수 있다. 그 외에 nsems 는 0 보다 크고 semid당 세마포어의 최대값 이하인 수이어야만 한다. (SEMMSL).

세마포어 집합이 이미 존재한다면, 접근 권한을 확인하고, 삭제될 것으로 표시되어있는지를 확인한다.

반환값
성공시, 반환값은 양의 정수값을 갖는 세마포어 집합 식별자일 것이고, 아니라면 에러를 나타내는 errno 와 함께 -1 이 반환된다.

에러
실패값 반환을 위해, errno 는 다음 값중 하나로 설정될 것이다:

EACCES
    key 에 대응하는 세마포어 집합이 존재하지만, 호출한 프로세스는 집합에 대한 접근권한이 없다.

EEXIST
    semflg 에 IPC_CREAT 와 IPC_EXCL 이 설정되어 있는데, key 에 대응하는 세마포어 집합이 이미 존재한다.

ENOENT
    key 에 대응하는 세마포어 집합이 존재하지 않고, semflg 에는 IPC_CREAT 가 설정되어 있지도 않다.

ENOMEM
    세마포어 집합이 생성되어야 하지만 시스템에 메모리가 부족하다.

ENOSPC
    세마포어 집합이 생성되어야 하지만 시스템의 세마포어 집합 갯수 최대값, (SEMMNI) 개별 세마포어 갯수의 최대값 (SEMMNS) 제한 때문에 만들지 못했다.

주의
IPC_PRIVATE 은 플래그가 아니고, key_t 타입이다. key 가 이 값을 갖을 때에 시스템 호출은 semflg 의 아래 9비트 이외의 다른 것은 모두 무시하고 새로운 세마포어 집합을 생성한다.

다음은 semget 호출에 영향을 주는 세마포어 설정 자원을 제한한다:

SEMMNI
    시스템 세마포어 설정의 최대값 범위: 정책의지.

SEMMSL
    semid당 세마포어의 최대값: 구현 의지 (현재 500).

SEMMNS
    시스템 세마포어의 최대값 범위; 정책 의지.

버그
IPC_PRIVATE 의 사용은 다른 할당된 세마포어 설정에 접근 프로세스들을 억제한다.

데이타 구조는 설정에 시스템 호출에 의해 초기화되지 않는 각 세마포어과 일치한다.

호환
SVr4, SVID. SVr4 documents additional error conditions EINVAL, EFBIG, E2BIG, EAGAIN, ERANGE, EFAULT.

관련 항목
ftok(3), ipc(5), semctl(2), semop(2)

번역
ASPLINUX <man@asp-linux.co.kr> 2000년 7월 29일
배성훈 <plodder@kldp.org> 2000년 11월 18일
한글 Mnapage 프로젝트 (http://man.kldp.org) 2005년 2월 14일