다음 위로 이전 목차 리눅스 프로그래머를 위한 가이드

시스템 호출: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