MSGGET(2)

이름
msgget - 메세지 큐 식별자를 가져온다.

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

int msgget ( key_t key, int msgflg )

설명
이 함수는 key 값과 관련된 메세지 큐 식별자를 반환한다. 만일, key가 IPC_PRIVATE 값을 가지고 있거나 또는 key가 IPC_PRIVATE가 아니고, key와 연계되어 있는 메세지 큐가 없다면 새로운 메세지 큐가 만들어지며 IPC_CREAT는 msgflg에 명시되어 있다. (i.e. msgflg&IPC_CREAT 는 0이 아니다.) msgflg에 존재하는 IPC_CREAT와 IPC_EXCL 필드는 open(2)시스템 호출의 모드 인자에서 O_CREAT와 O_EXCL이 있는 것처럼 메세지 큐의 존재에 대해 같은 역할을 한다.: 만일 msgflg가 IPC_CREAT와 IPC_EXCL이고 key를 위한 메세지 큐가 이미 존재한다면, msgget 시스템 콜은 실패한다.

생성시, msgflg 인자의 하위 9비트는 메세지 큐에 대한 접근 허가권을 정의한다. 이 허가권은 open(2)이나 creat(2)시스템 콜에 있는 접근 허가권과 같은 형태, 같은 의미를 가진다. (실행 허가권은 사용되지 않는다.)

더군다나, 생성하는 동안, 시스템 콜은 다음과 같은 시스템 메세지 큐 데이터 구조체 msqid_ds를 초기화 한다.

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

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

    msg_perm.mode의 하위 9비트는 msgflg의 하위 9비트로 설정된다.

    msg_qnum, msg_lspid, msg_lrpid, msg_stime 그리고 msg_rtime는 0으로 설정된다.

    msg_ctime은 현재 시간으로 설정된다.

    msg_qbytes는 시스템 제한값 MSGMNB으로 설정된다.

만일 메세지 큐가 이미 존재한다면 접근 허가권을 검증하고, 메시지 큐가 소멸되도록 설정되어 있는지를 알아본다.

반환값
성공시, 반환값은 메세지 큐 식별자(비 음수 정수)가 되며, 그렇지 않으면 에러를 가리키는 errno와함께 -1이 반환된다.

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

EACCES
    key에 해당 하는 메세지 큐가 존재하지만 호출 프로세스가 큐에 대한 접근 허가권을 가지고 있지 않다.

EEXIST
    key에 해당하는 메세지 큐가 존재하며 msgflg가 IPC_CREAT와 IPC_EXCL를 모두 가지고 있다.

EIDRM
    메세지 큐가 제거되도록 표시되어 있다.

ENOENT
    key에 해당하는 메세지 큐가 존재하지 않으며 msgflg에 IPC_CREAT가 존재하지 않는다.

ENOMEM
    메세지 큐가 만들어 졌지만 시스템은 새로운 데이터 구조를 위한 메모리 공간이 충분하지 않다.

ENOSPC
    메세지 큐가 만들어 졌지만 시스템 제한 값인 메세지 큐의 최대 수 (MSGMNI)를 초과했다.

주의
IPC_PRIVATE는 플래그 필드가 아니고 key_t 타입이다. 이 특별한 값이 key에 사용된다면, 시스템 콜은 msgflg의 하위 8비트를 제외한 모든 것을 무시한다. 그리고 성공시 새로운 메세지 큐를 생성한다.

다음은 msgget 함수에 영향을 주는 메세지 큐 자원에 대한 시스템 제한값이다:

MSGMNI
    메세지 큐의 시스템 최대 수 : 정책에 의존적이다.

버그
IPC_PRIVATE의 사용은 할당된 메세지 큐에 접근하는 다른 프로세스를 실제로 막지 못한다.

파일에서처럼 메세지 큐에 배타적 접근을 보장하도록 프로세스를 위한 내부적 방법은 없다. 단지 msgflg에 IPC_CREAT와 IPC_EXCL를 명시하는 것이 새로운 메세지 큐가 생성되었다는 것을 보장하지만(성공시) 이것이 메세지 큐에 대한 배타적 접근을 암시하는 것은 아니다.

호환
SVr4, SVID. SVr4 는 EIDRM 에러 코드를 문서화하지 않았다.

관련 항목
ftok(3), ipc(5), msgctl(2), msgsnd(2), msgrcv(2)

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