SEMCTL(2)

이름
semctl - 세마포어 제어기.

사용법
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
/* union semun is defined by including <sys/sem.h> */
#else
/* according to X/OPEN we have to define it ourselves */
union semun {
        int val;                    /* SETVAL을 위한값 */
        struct semid_ds *buf;       /* IPC_STAT, IPC_SET을 위한 버퍼 */
        unsigned short int *array;  /* GETALL, SETALL을 위한 배열 */
        struct seminfo *__buf;      /* IPC_INFO을 위한 버퍼 */
};
#endif

int semctl (int semid, int semnum, int cmd, union semun arg)

설명
semctl 함수는 semid 가 가리키는 세마포어 집합, 혹은 이 집합의 semnum 번째 세마포어(세마포어는 0 번부터 시작한다.)에 cmd 가 지정하는 제어작용을 실행한다.

cmd 가 갖는 값은 다음과 같다.

IPC_STAT
    arg.buf 포인터가 가리키는 구조체에 세마포어 집합의 데이타 구조 정보를 복사한다. semnum 인수는 무시된다. 호출한 프로세스는 세마포어 설정에 읽기권한이 있어야한다.

IPC_RMID
    세마포어 집합과 데이타 구조를 즉시 제거하고, 모든 대기중인 프로세스들을 재실행한다. 호출한 프로세스의 유효 사용자ID는 수퍼유저나 세마포어 집합의 생성자 혹은 소유자중의 하나여야 한다. 인수 semnum 는 무시된다.

GETALL
    집합의 모든 세마포어에 대한 semval 값을 arg.array. 에 저장한다. 변수 semnum 는 무시된다. 호출한 프로세스는 세마포어설정에 읽기 권한이 있어야한다.

GETNCNT
    semnum 번째 세마포어의 semncnt 값을 반환한다. 이 값은 세마포어의 semval 값이 증가하기를 기다리고 있는 프로세스의 수를 나타낸다. 호출한 프로세스는 세마포어 설정에 읽기 권한이 있어야한다.

GETPID
    세마포어 호출은 sempid 의 값을 반환한다. 이 값은 가장 최근에 해당 세마포어에 semop 호출을 했던 프로세스의 pid를 나타낸다. 호출한 프로세스는 세마포어 설정에 읽기 권한이 있어야한다.

GETVAL
    집합의 semnum 번째 세마포어에 대한 semval 의 값을 반환한다. 호출 프로세스는 세마포어 설정에 대한 읽기 접근에 있어 특별한 권한을 갖고 있어야 한다.

GETZCNT
    시스템 호출은 집합의 semnum 번째 세마포어에 대한 semzcnt 의 값을 반환한다.이 값은 세마포어의 semval 값이 0이 되기를 기다리고 있는 프로세스의 수를 나타낸다. 호출 프로세스는 세마포어 설정에 대한 읽기 접근 권한들을 갖고 있어야 한다.

SETALL
    arg.array 인수 배열을 사용하여 집합의 모든 세마포어의 semval 값을 설정한다. 집합과 관련된 semid_ds 구조체의 sem_ctime 멤버를 또한 업데이트한다. 모든 프로세스에서 변경된 세마포어에 대해 Undo 엔트리들은 소거된다. 대기열에서 유휴중인 프로세스들은 일부 semval 이 0이 되거나, 증가하면, 다시 활성화된다. 인수 semnum 은 무시된다. 호출 프로세스는 세마포어 설정에 대한 변경 접근 권한을 갖고 있어야 한다.

SETVAL
    arg.val 값을 사용하여 집합의 semnum 번째 세마포어의 semval 값을 설정한다. semid_ds 구조의 sem_ctime 멤버를 또한 업데이트시킨다. 모든 프로세스에서 변경된 세마포어에 대해 Undo 엔트리들은 소거된다. 대기열에서 유휴중인 프로세스들은 semval 이 0이 되거나, 증가하면, 다시 활성화된다. 인수 semnum 은 무시된다. 호출 프로세스는 세마포어 설정에 대한 변경 접근 권한을 갖고 있어야 한다.

반환값
실패하면, 시스템 호출은 에러를 가리키는 errno 와 함께 -1 를 리턴한다. 그렇지 않으면, 시스템 호출은 아래와 같이 cmd 에 따라 음수값이 아닌 값을 리턴한다.

GETNCNT
    semncnt 의 값 .

GETPID
    sempid 의 값 .

GETVAL
    semval 의 값.

GETZCNT
    semzcnt 의 값 .

에러
실패 리턴에 대하여, errno 는 다음의 값들중 하나로 설정될 것이다.:

EACCES
    호출 프로세스는 cmd 를 실행하는데 필요한 접근 권한을 갖고 있지 않는다.

EFAULT
    arg.buf 에 의해 가리키는 주소나 arg.array 는 접근이 불가능하다.

EIDRM
    세마포어 설정은 삭제되었다.

EINVAL
    cmd 또는 semid 에 대한 부적절한 값.

EPERM
    인수 cmd 가 IPC_SET 또는 IPC_RMID 값을 갖지만, 호출 프로세스 유효 사용자 ID는 명령을 실행시킬 수 있는 충분치 않은 특권들을 갖는다.

ERANGE
    인수 cmd 는 SETALL 또는 SETVAL를 갖고, and the value to which semval 가 0보다 적고 구현 값보다 더 크게 설정되어야 하는 값을 갖는다. SEMVMX.

주의
IPC_INFO, SEM_STAT 그리고 SEM_INFO 제어 호출들은 할당된 자원들에 정보를 제공하는 ipcs(8) 프로그램에 의해 사용된다.

세마포어 설정에 대한 다음의 시스템 제한은 semctl 호출에 영향을 미친다.

SEMVMX
    semval 에 대한 최대값은 구현에 의존적이다 (32767).

호환
SVr4, SVID. SVr4는 에러 조건 EINVAL과 EOVERFLOW에 대한 문서를 작성한다.

관련 항목
ipc(5), shmget(2), shmat(2), shmdt(2)

번역
ASPLINUX<man@asp-linux.co.kr> 2000년 7월 29일
배성훈 <plodder@kldp.org> 2000년 11월 18일
한글 Manpage 프로젝트 (http://man.kldp.org) 2005년 2월 14일