MSGGET(2) | 리눅스 프로그래머 매뉴얼 | 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 에러 코드를 문서화하지 않았다.
관련 항목¶
번역¶
정강훈 <skyeyes@soback.kornet.net>
2000년 6월 19일
한글 Manpage 프로젝트
(http://man.kldp.org) 2005년 2월 15일
1993년 11월 1일 | Linux 0.99.13 |