SEMCTL(2)

명칭
semctl - semaphore 집합에 대한 조작을 제어한다

프로그램 라이브러리
libc

서식
<sys/types.h> <sys/ipc.h> <sys/sem.h> int semctl(int semid, int semnum, int cmd, ...)

해설
semctl() (은)는, cmd 하지만 가리키는 조작을 semid 그리고 나타나는 semaphore 집합에 대해서 실행합니다. 어느 값의 cmd 에 대해서는, 4 번째의 인수 union semun arg 하지만 필요합니다. arg 파라미터를 사용하는 명령의 경우, union semun (은)는 다음과 같이 정의됩니다.

    union semun {
            int     val;            /*  SETVAL 용의 값 */
            struct  semid_ds *buf;  /*  IPC_STAT 및 IPC_SET 용의 버퍼 */
            u_short *array;         /*  GETALL 및 SETALL 용의 배열 */
    };

명령은 다음과 같이 실행됩니다.

IPC_STAT
    semaphore 집합의 struct semid_ds (을)를 취득해, arg.buf 하지만 가리키는 메모리에 보존합니다.

IPC_SET
    semaphore 집합의 struct semid_ds 의 멤버 sem_perm.uid, sem_perm.gid 및 sem_perm.mode (을)를, arg.buf 하지만 가리키는 구조체의 멤버와 일치하도록(듯이) 변경합니다. 호출원프로세스의 실효 유저 ID 는, sem_perm.uid 또는 sem_perm.cuid 의 어느 쪽일까하고 일치할 필요가 있는지, 또는 슈퍼 유저 특권을 가지고 있을 필요가 있습니다.

IPC_RMID
    semaphore 집합을 즉시 시스템으로부터 삭제합니다. 호출원프로세스의 실효 유저 ID 가 semaphore 집합의 sem_perm.uid 또는 sem_perm.cuid (와)과 동일한지, 또는 프로세스가 슈퍼 유저 특권을 가지고 있을 필요가 있습니다.

GETVAL
    semaphore 번호 semnum 의 값을 돌려줍니다.

SETVAL
    semaphore 번호 semnum 의 값을 arg.val (으)로 설정합니다.

GETPID
    semaphore 번호 semnum 에 붙어 조작을 실행한 마지막 프로세스의 프로세스 ID 를 돌려줍니다.

GETNCNT
    semaphore 번호 semnum 의 값이 현재의 값보다 커지는 것을 기다리고 있는 프로세스의 수를 돌려줍니다.

GETZCNT
    semaphore 번호 semnum 의 값이 0 이 되는 것을 기다리고 있는 프로세스의 수를 돌려줍니다.

GETALL
    집합내의 모든 semaphore의 값을 arg.array 하지만 가리키는 배열내에 취득합니다.

SETALL
    집합내의 모든 semaphore의 값을 arg.array 하지만 가리키는 배열내의 값으로 설정합니다.

struct semid_ds (은)는 다음과 같이 정의됩니다.

    struct semid_ds {
            struct  ipc_perm sem_perm;      /* 조작 퍼미션 구조체 */
            struct  sem *sem_base;  /* 집합내의 최초의 semaphore에의 포인터 */
            u_short sem_nsems;      /* 집합내의 semaphore의 수 */
            time_t  sem_otime;      /* 마지막 조작 시각 */
            long    sem_pad1;       /* SVABI/386 에 밤과 이것이 필요 */
            time_t  sem_ctime;      /* 마지막 변경 시각
                                     * 1970/01/01 00:00:00 GMT
                                     * (으)로부터의 초단위의 경과시간
                                     */
            long    sem_pad2;       /* SVABI/386 에 밤과 이것이 필요 */
            long    sem_pad3[4];    /* SVABI/386 에 밤과 이것이 필요 */
    };

반환값
처리가 정상적으로 완료하면(자), cmd 하지만 GETVAL, GETPID, GETNCNT, GETZCNT 의 어떤 것인가일 때, semctl() (은)는 대응하는 값을 돌려줍니다. 그렇지 않은 경우는 0 을 돌려줍니다. 처리에 실패했을 경우는,-1 을 돌려주어, 에러를 나타내기 위해서(때문에) errno (을)를 설정합니다.

에러
semctl() (은)는 다음의 경우에 처리에 실패합니다.

[EINVAL]
    semid 에 대응하는 semaphore 집합이 없습니다.

[EINVAL]
    semnum 하지만, 지정의 semaphore 집합에 대해서 유효한 semaphore의 범위내에 없습니다.

[EPERM]
    호출원프로세스의 실효 유저 ID 가, semaphore 집합의 소유자 또는 작성자의 유저 ID 와 일치하지 않습니다.

[EACCES]
    조작과 semaphore 집합의 모드의 사이에 불일치가 있었기 때문에 퍼미션이 거부되었습니다.

관련 항목
semget(2), semop(2)