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

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

새로운 세마퍼 집합을 만들거나 존재하는 집합에 접근하기 위하여, semget() 시스템 호출을 사용한다.


  SYSTEM CALL: semget();                                                          

  PROTOTYPE: int semget ( key_t key, int nsems, int semflg );                                             
    RETURNS: semaphore set IPC identifier on success
             -1 on error: errno = EACCESS (permission denied)
                                  EEXIST (set exists, cannot create (IPC_EXCL))
                                  EIDRM (set is marked for deletion)
                                  ENOENT (set does not exist, no IPC_CREAT was used)
                                  ENOMEM (Not enough memory to create new set)
                                  ENOSPC (Maximum set limit exceeded)
  NOTES:

semget()의 첫번째 아규먼트는 ftok()의 호출에 의해 반환된 키값이다. 이 키값은 커널안에 존재하는 다른 세마퍼 집합의 키값과 비교된다. 이때 열거나 접근하는 동작은 semflg 아규먼트의 내용에 따라 결정된다.

IPC_CREAT
커널안에 이미 존재하지 않는다면 세마퍼 집합을 만든다.
IPC_EXCL
IPC_CREAT와 같이 사용되어, 세마퍼가 이미 존재하면 실패한다.
IPC_CREAT가 혼자 사용된다면, semget()은 새로 만들어진 집합의 세마퍼 집합 확인자 (the semaphore set identifier)를 반환하거나 같은 키값을 가지고 이미 존재하는 집합의 확인자를 반환한다. IPC_EXCL가 IPC_CREAT와 함께 쓰였다면, 새 집합을 만들거나 이미 집합이 존재한다면 -1 값을 가지고 호출에 실패한다. IPC_EXCL은 그 자체로는 의미가 없지만, IPC_CREAT와 조합되어 쓰여질 때 존재하지않는 세마퍼를 접근(access)하기 위해 열려지는 것을 막는 장치로 사용될 수 있다.

시스템 V IPC의 다른 형태들처럼 부가적인 8진 모드가 세마퍼 집합의 허가사항 형태에 마스크로 OR될 수 있다.

nsems 아규먼트는 새 집합안에서 만들어져야 하는 세마퍼의 갯수를 지정한다. 이것은 앞에서 설명했던 가상의 인쇄방의 프린터의 갯수를 의미한다. 집합안의 초ㅐ대 세마퍼의 갯수는 linux/sem.h에 정의 되어있다.

	#define SEMMSL	32	/* <=512 id당 세마퍼의 최대 갯수 */
이미 존재하는 집합을 명확히 열고 있다면, nsems 아규먼트는 무시됨에 주목해라.

세마퍼 집합을 만들고 여는 wrapper 함수를 만들어 보자:


int open_semaphore_set( key_t keyval, int numsems )
{
        int     sid;

        if ( ! numsems )
                return(-1);
        
        if((sid = semget( mykey, numsems, IPC_CREAT | 0660 )) == -1)
        {
                return(-1);
        }
        
        return(sid);
}

0600의 명시적인 허가사항을 사용함에 주의해라. 이 작은 함수는 세마퍼 집합 확인자(int)를 반환하거나 에러시 -1을 반환한다. 새 집합이 만들어졌다면, 공간을 할당하기 위해 세마퍼의 갯수와 마찬가지로 키값이 넘겨져야 한다. 이장의 끝에서 표현될 예제에서, 세마퍼 집합이 존재하는지 존재하지 않는지를 결정하기 위한 IPC_EXCL 플래그의 사용에 주목해라.


이전:내부 자료 구조 (Internal Data Structures) 다음:시스템 호출:semop() (SYSTEM CALL:semop())

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

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