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

시스템 호출:shmget() (SYSTEM CALL:shmget())

새로운 메세지 큐를 만들거나 존재하는 큐에 접근하기 위해, shmget() 시스템 호출이 사용된다.


  SYSTEM CALL: shmget();                                                          

  PROTOTYPE: int shmget ( key_t key, int size, int shmflg );                                             
    RETURNS: shared memory segment identifier on success                                                       
             -1 on error: errno = EINVAL (Invalid segment size specified)
                                  EEXIST (Segment exists, cannot create)
                                  EIDRM (Segment is marked for deletion, or was removed)
                                  ENOENT (Segment does not exist)
                                  EACCES (Permission denied)
                                  ENOMEM (Not enough memory to create segment)
  NOTES:

이시점에서 이런 특별한 호출은 거의 알고있는 것처럼 보여야 한다. 이것은 메세지 큐와 세마퍼 집합의 get 호출과 매우 비슷하다.

shmget()의 첫번째 아규먼트는 키값이다(ftok()호출에 의해 반환된). 이 키값은 커널안에 존재하는 다른 공유 메모리 세그먼트의 키값과 비교되어진다. 이때, 열기 나 접근 동작은 shmflg 아규먼트의 내용에 달려있다.

IPC_CREAT

커널안에 이미 존재하지 않는다면 세그먼트를 만든다.

IPC_EXCL

IPC_CREAT와 함께 사용될 때, 세그먼트가 이미 존재하면 실패한다.

IPC_CREAT가 혼자 사용되면, shmget()은 새롭게 만들어진 세그먼트의 세그먼트 확인자를 반환하거나 같은 키값을 가진 세그먼트가 존재하면 그 세그먼트의 확인자를 반환한다. IPC_EXCL이 IPC_CREAT와 함께 사용된다면, 새로운 세그먼트가 만들어 지거나 세그먼트가 존재하면, -1값을 가지며 호출은 실패한다. IPC_EXCL은 그 자체로는 쓸모가 없지만, IPC_CREAT와 조합될 때, 존재하지 않는 세그먼트가 접근을 위해 열리는 것을 막는데 사용된다.

다시 한번, 부가적인 8진 모드는 마스크안에 OR될 수 있다.

공유 메모리 세그먼트를 만들고 위치시키기 위한 wrapper 함수를 만들어 보자:


int open_segment( key_t keyval, int segsize )
{
        int     shmid;
        
        if((shmid = shmget( keyval, segsize, IPC_CREAT | 0660 )) == -1)
        {
                return(-1);
        }
        
        return(shmid);
}

명시적인 허가사항으로 0660을 사용했음에 주목하라. 이 작은 함수는 공유 메모리 세그먼트의 확인자(int)를 반화하거나, 에러시 -1을 반환한다. 키값과 요구되는 세그먼트 크기 (바이트 단위)는 아규먼트로 넘겨진다.

프로세스가 주어진 세그먼트의 유효한 IPC 확인자를 가진 후, 다음 단계는 프로세스가 자신의 주소 공간에 세그먼트를 그리거나(map) 붙이는(attach) 것이다.


이전:내부와 사용자 자료 구조 다음:시스템 호출:shmat()
[홈페이지] [데이타베이스] [프로그래밍] [수퍼브가] [컴퓨터게임] [잡다한것들]

Copyright (c) 1996,1997 by Euibeom.Hwang & SangEun.Oh All Rights Reserved

Email To:Webmaster , Another address
LAST UPDATE Nov 28,1997
Created Nov 28,1997