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)을 초과하였습니다.
'C언어 header > sys | sem.h' 카테고리의 다른 글
semtimedop(2) - System V semaphore operations (timeout) (0) | 2019.09.29 |
---|---|
semop(2) - System V semaphore operations (0) | 2019.09.29 |
semctl(2) System V semaphore 제어 작업 수행 (0) | 2019.09.29 |