리눅스 프로그래머를 위한 가이드
시스템 호출:msgget() (SYSTEM CALL:msgget())
새로운 메세지 큐를 만들기 위하여 또는 존재하는 큐에 접근하기 위하여, msgget() 시스템 호출이
사용된다.
SYSTEM CALL: msgget();
PROTOTYPE: int msgget ( key_t key, int msgflg );
RETURNS: 성공시 메세지 큐의 확인자(message queue identifier)
-1 on error: errno = EACCESS (접근권한이 없음)
EEXIST (큐가 이미 존재하여 만들 수 없음)
EIDRM (큐에 삭제 표시가 되어 있음)
ENOENT (큐가 존재하지 않음)
ENOMEM (큐를 만들기에 메모리가 부족함)
ENOSPC (최대 큐의 갯수를 초과함)
NOTES:
msgget()의 첫번째 아규먼트는 키값이다.(ftok()를 호출하여 넘겨받은 경우)
이 키값은 커널안에 있는 다른 메세지 큐들에 대해 키값이 존재하는지를 비교한다.
이때, 열기(open)나 접근(access) 동작은 msgflg 아규먼트의 내용에 따른다.
- IPC_CREAT
- 커널안에 존재하는지를 확인한 후 큐를 만든다.
- IPC_EXCL
- IPC_CREAT가 사용될 때, 큐가 이미 존재하면 실패처리한다.
IPC_CREAT가 혼자 사용되면, msgget()는 새롭게 생선된 메세지 큐의 메세지 큐 확인자
(the message queue identifier)를 반환하거나, 같은 키값을 가지고 이미 존재하는 큐의 확인자를
반환한다. IPC_EXCL이 IPC_CREAT와 함께 사용되면, 새로운 큐가 만들어지거나 큐가 존재하면
-1를 가지며 호출에 실패한다. IPC_EXCL은 그 자체로는 쓸모가 없지만, IPC_CREAT와 함께
조합되어 접근하기 위한 존재하지 않는 큐를 여는(open) 것을 보장하는데 사용될 수 있다.
IPC 객체는 유닉스 파일 시스템상의 파일 허가사항의 기능과 비슷한 허가사항을 가지고 있으므로,
부가적인 8진 모드는 마스크 안에 OR될 것이다!
메세지 큐를 만들거나 열기 위한 빠른 wrapper 함수를 만들어 보자:
int open_queue(key_t keyval)
{
int qid;
if((qid = msgget( keyval, IPC_CREAT | 0660 )) == -1)
{
return(-1);
}
return(qid);
}
묵시적으로 0660의 허가사항(permission)을 사용함을 주목하라. 이 작은 함수는 메세지 큐 확인자
(int)를 반환하거나 에러시 -1을 반환한다. 키 값은 아규먼트로 넘겨져야만 한다.
이전:내부와 사용자 자료 구조 (Internal and User Data Structures)
다음:시스템 호출:msgsnd() (SYSTEM CALL:msgsnd())
Copyright (c) 1996,1997 by Euibeom.Hwang & SangEun.Oh All Rights Reserved
Email To:Webmaster ,
Another address
LAST UPDATE Nov 18,1997
Created Nov 17,1997