semget(2)

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

int semget(key_t key, int nsems, int semflg);

semget(2)함수는 argument key에 대한 System V semaphore ID를 얻는 함수입니다.

 

key의 값이 IPC_PRIVATE이면, 임의의 key값으로 항상 새로운 semaphore를 생성합니다. 

IPC_PRIVATE로 생성하는 경우에는 key값을 다른 프로세스에서는 모르기 때문에 semget(2)으로 return된 semaphore id를 파일 등으로 공유하여 다른 프로세스가 알 수 있도록 해야 합니다.

key 값이 IPC_PRIVATE가 아닌 경우에는 semflg가 IPC_CREAT이면 key값으로 새로운 semaphore를 생성합니다. 이미 생성된 경우에는 이미 생성된 semaphore id를 return합니다.

 

만약 semflg가 IPC_CREAT | IPC_EXCL이면 이미 생성된 semaphore id가 있는 경우에는 EEXIST 오류값이 errno에 설정되고 -1을 return합니다.

 

POSIX의 규정에는 semaphore가 새로 생성되면 semaphore의 값을 반드시 초기화한다는 규정이 없습니다. 

LINUX를 포함한 대부분의 OS에서 0으로 초기화합니다. System V semaphore를 지원하는 모든 OS에서 호환시키려면 최초 생성후에 semctl(2)을 이용하여 0으로 초기화가 필요합니다.

 

semget(2)으로 새로 생성된 경우, semctl(2)로 semid_ds 구조체 정보를 조회하면 아래와 같이 초기화가 됩니다.

   sem_perm.cuid : semget(2)함수를 호출한 프로세스의 effective user ID

   sem_perm.uid  : semget(2)함수를 호출한 프로세스의 effective user ID

   sem_perm.cgid : semget(2)함수를 호출한 프로세스의 effective group ID 

   sem_perm.gid  : semget(2)함수를 호출한 프로세스의 effective group ID

   sem_perm.mode : semget(2)의 semflg의 하위 9 bit값

   sem_nsems : semget(2)의 파라미터 nsems의 값으로 설정됨

   sem_otime : 0

   sem_ctime : 현재시간

 

 

파라미터

key
    - 0보다 큰 정수값 또는 ftok(3)함수의 return 값 또는 IPC_PRIVATE

   IPC_PRIVATE로 설정되는 경우에는 항상 새로운 semaphore를 생성합니다.
   IPC_PRIVATE로 설정한 경우에는 key값을 알 수 없기때문에 return된 semaphore id는 
       다른 프로세스와 공유하기 위한 방법(예, 파일로 공유하기)을 제공해야 합니다.
nsems
    - 하나의 semaphore id에 생성하려는 semaphore set의 개수를 nsems개로 설정합니다.
    - key에 대해서 semaphore id가 이미 생성되어 있었으면 nsems의 값은 0으로 설정되어도 되지만, 
      그렇지 않으면 0보다 크고 SEMMSL 이하의 값이어야 합니다.
semflg
    - IPC_CREAT와 IPC_EXCL, 그리고 open(2)의 mode(접근권한)와 같은 9 bit값의 bit OR의 조합으로 설정합니다.

 IPC_CREAT : key값으로 새로운 semaphore를 생성합니다. 
         이미 생성된 경우에는 이미 생성된 semaphore id를 return합니다.
         IPC_CREAT가 bit or에 포함되지 않음: 이미 생성된 semaphore id를 return합니다. 
         이미 생성된 semaphore id가 없으면 오류가 발생합니다.
 IPC_EXCL : IPC_CREAT와 함께 사용하면 이미 생성된 semaphore id가 있으면 오류가 발생하라는 의미입니다.

 접근권한은 open(2) 또는 creat(2)의 mode와 같이 0666(8진수)형태로 처리하며 실행권한은 무시됩니다.

 ※IPC_PRIVATE는 semflg에 설정하는 값이 아니고 key에 설정하는 값입니다.


설정예).
 0 : 생성되어 있지 않으면 오류가 발생하고, 이미 생성되어 있다면 생성되어 있는 semaphore id를 return합니다.
 IPC_CREAT | 0666  : 생성되어 있지 않으면 새로 생성하고, 새로 생성한다면 권한을 0666으로 생성합니다.
     이미 생성된 것이 있다면 이미 생성되어 있던 semaphore id를 return합니다.
 IPC_CREAT | IPC_EXL | 0666 : 생성되어 있지 않으면 새로 생성하고, 
     새로 생성한다면 권한을 0666으로 생성함. 이미 생성되었다면 오류를 return합니다.

 

RETURN

양수
    - 정상적으로 처리되었으며, semaphore id를 return합니다.

-1
    - 오류가 발생하였으며, 상세한 오류는 errno에 설정됩니다.

 EACCES : key로 이미 생성된 semaphore id가 있지만 접근 권한이 없습니다.
 EEXIST : IPC_CREAT | IPC_EXCL이 설정되었다면, 이미 생성된 semaphore id가 있다는 오류입니다.
 ENOENT : key로 이미 생성된 semaphore id가 없으며 semflg에 IPC_CREAT를 설정하지 않아서
          semaphore id를 return할 수 없습니다.
 ENOMEM : semaphore 집합을 생성해야 하지만 시스템메모리가 부족합니다.
 ENOSPC : semaphore 집합을 생성해야 하지만 시스템에서 생성할 수 있는 semaphore 집합 갯수(SEMMNI)를 
          초과하였거나, 하나의 semaphore 집합의 semaphore 갯수 최대값(SEMMNS)을 초과하였습니다.   

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요