반응형
semctl(2)
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semctl(int semid, int semnum, int cmd, ...);
semctl(2)은 semid에 의해 식별된 System V semaphore set이나 semaphore set의 semnum번째(0부터 시작함)에 대해 제어를 하는 함수입니다. semctl(2)의 파라미터는 cmd값에 따라서 3 ~ 4개의 parameter를 갖습니다. cmd값에 따라 아래와 같은 조합으로 실행될 수 있습니다.
int semctl(int semid, 0(무시됨), IPC_RMID);
- semid로 식별되는 semaphore set을 삭제합니다.
int semctl(int semid, 0(무시됨), IPC_STAT, struct semid_ds *buf);
- semid로 식별되는 semaphore set의 정보를 읽어서 buf에 저장합니다.
int semctl(int semid, 0(무시됨), IPC_SET, struct semid_ds *buf);
- semid로 식별되는 semaphore set의 정보를 buf의 값으로 변경합니다.
- 구조체 semid_ds의 sem_perm.uid, sem_perm.gid, sem_perm.mode를 변경할 수 있으며, sem_ctime값도 update됩니다.
int semctl(int semid, 0(무시됨), GETALL, unsigned short *array);
- semid로 식별되는 semaphore set의 모든 배열값을 array에 저장합니다.
int semctl(int semid, 0(무시됨), SETALL, unsigned short *array);
- semid로 식별되는 semaphore set의 모든 배열값을 array의 값으로 설정 또는 변경합니다.
int semctl(int semid, int semnum, GETVAL);
- semid로 식별되는 semaphore set의 semnum번째 배열의 값(semval)을 얻습니다.
int semctl(int semid, int semnum, SETVAL, int val);
- semid로 식별되는 semaphore set의 semnum번째 배열의 값(semval)을 설정 또는 변경합니다.
int semctl(int semid, int semnum, GETNCNT);
- semid로 식별되는 semaphore set의 semnum번째 배열의 값(semval)이 현재값보다 증가되기를 기다리는 process의 수를 return 합니다.
int semctl(int semid, int semnum, GETZCNT);
- semid로 식별되는 semaphore set의 semnum번째 배열의 값(semval)이 0이 되기를 기다리는 process의 수를 return 합니다.
int semctl(int semid, int semnum, GETPID);
- semid로 식별되는 semaphore set의 semnum번째 배열을 최종 처리한 process의 ID를 return 합니다.
/* 네번째 파라미터는 union이기 때문에, member의 type으로 실행해도 됩니다. */
union semun {
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
};
The semid_ds data structure is defined in <sys/sem.h> as follows:
struct semid_ds {
struct ipc_perm sem_perm; /* Ownership and permissions */
time_t sem_otime; /* Last semop time */
time_t sem_ctime; /* Last change time */
unsigned long sem_nsems; /* No. of semaphores in set */
};
struct ipc_perm {
key_t __key; /* Key supplied to semget(2) */
uid_t uid; /* Effective UID of owner */
gid_t gid; /* Effective GID of owner */
uid_t cuid; /* Effective UID of creator */
gid_t cgid; /* Effective GID of creator */
unsigned short mode; /* Permissions */
unsigned short __seq; /* Sequence number */
};
파라미터
semid
- semget(2)함수가 return한 System V semaphore set ID.
semnum
- semaphore set의 배열의 처리할 index(번째).
cmd의 값이 IPC_RMID, IPC_STAT, IPC_SET, GETALL, SETALL 이면 값이 무시됩니다.
cmd
- 처리할 명령어값.
IPC_RMID : semid로 식별되는 semaphore set을 삭제합니다.
IPC_STAT : semid로 식별되는 semaphore set의 정보를 읽어 struct semid_ds에 저장합니다.
IPC_SET : semid로 식별되는 semaphore set의 정보를 struct semid_ds *buf값으로 변경합니다.
변경가능한 항목은 struct semid_ds의 sem_perm.uid, sem_perm.gid, sem_perm.mode를 변경할 수 있으며,
sem_ctime값도 update됩니다.
GETALL : semaphore set의 모든 배열값을 array에 저장합니다.
SETALL : semaphore set의 모든 배열값을 array의 값으로 설정 또는 변경합니다.
GETVAL : semaphore set의 semnum번째 배열의 값(semval)을 얻습니다.
SETVAL : semaphore set의 semnum번째 배열의 값(semval)을 설정 또는 변경합니다.
GETNCNT: semaphore set의 semnum번째 배열의 값(semval)이 현재값보다 증가되기를
기다리는 process의 수를 return 합니다.
GETZCNT: semaphore set의 semnum번째 배열의 값(semval)이 0이 되기를
기다리는 process의 수를 return 합니다.
GETPID : semaphore set의 semnum번째 배열을 최종 처리한 process의 ID를 return 합니다.
...
- cmd의 값에 따라 사용여부 및 데이터 type이 결정됨
/* 네번째 파라미터는 union이기 때문에, member의 type으로 실행해도 됩니다. */
union semun {
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
};
The semid_ds data structure is defined in <sys/sem.h> as follows:
struct semid_ds {
struct ipc_perm sem_perm; /* Ownership and permissions */
time_t sem_otime; /* Last semop time */
time_t sem_ctime; /* Last change time */
unsigned long sem_nsems; /* No. of semaphores in set */
};
struct ipc_perm {
key_t __key; /* Key supplied to semget(2) */
uid_t uid; /* Effective UID of owner */
gid_t gid; /* Effective GID of owner */
uid_t cuid; /* Effective UID of creator */
gid_t cgid; /* Effective GID of creator */
unsigned short mode; /* Permissions */
unsigned short __seq; /* Sequence number */
};
RETURN
-1이 아님
- cmd의 값이 아래와 같을 때,
GETNCNT : semnum번째 배열의 현재값보다 증가 되기를 기다리는 process의 수를 return합니다.
GETPID : semnum번째 배열을 마지막으로 처리한 porcess id를 return합니다.
GETVAL : semnum번째 배열의 semaphore값(semval)을 return 합니다.
GETZCNT : semnum번째 배열의 값이 0이 되기를 기다리는 process의 수를 return 합니다.
-1
- 오류가 발생하였으며, 상세한 오류는 errno에 설정됩니다.
EACCES : cmd의 값이 GETALL, GETPID, GETVAL, GETNCNT, GETZCNT, IPC_STAT, SEM_STAT, SETALL, SETVAL일 때,
semaphore 정보값을 조회 또는 설정할 수 있는 권한이 없습니다.
EFAULT : 4번째 파라미터의 값이 유효한 address가 압니다.
EIDRM : semaphore set이 삭제되었습니다.
EINVAL : cmd나 semid 값이 유효하지 않습니다.
EPERM : cmd의 명령값이 IPC_SET 또는 IPC_RMID이면서 처리 권한이 없습니다.
ERANGE : cmd의 값이 SETALL, SETVAL 일 때,
set에 설정할 semaphore의 값이 0보다 작거나 SEMVMX보다 클때에 발생합니다.
반응형
'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 |
semget(2) - System V semaphore ID를 생성 (0) | 2019.09.29 |