SEMOP(2)

명칭
semop - semaphore 집합에 대한 불가분인 조작의 배열

프로그램 라이브러리
libc

서식
<sys/types.h> <sys/ipc.h> <sys/sem.h> int semop(int semid, struct sembuf array[], unsigned nops)

해설
semop() (은)는, semid 하지만 가리키는 semaphore 집합에 대해서, array 하지만 가리키는 조작의 배열을 불가분에 실행합니다. array 의 길이는 nops 그리고 가리킵니다. 각 조작은 struct sembuf 안에 encode 되고 있어 struct sembuf (은)는 다음과 같이 정의됩니다.

    struct sembuf {
            u_short sem_num;        /* semaphore 번호 */
            short   sem_op;         /* semaphore 조작 */
            short   sem_flg;        /* 조작 플래그 */
    };

array 안의 각 요소에 관계되어, sem_op (와)과 sem_flg (은)는, 집합내의 semaphore 번호 sem_num 에 대해서 실행되는 조작을 결정합니다. 지정한 조작의 동작을 변경하기 위해서, SEM_UNDO (와)과 IPC_NOWAIT 의 값의 논리합 ( OR )(을)를 취해 sem_flg 멤버에 넣는 것이 가능합니다.

실행되는 조작은 다음과 같이 sem_op 의 값에 의존합니다.

•   sem_op 하지만 정의 경우, semaphore의 값을 sem_op 의 값만 증가시킵니다. SEM_UNDO (을)를 지정했을 경우, semaphore의 종료시 조정치를 sem_op 의 값만 감소시킵니다. sem_op 에 대한 정의 값은, 일반적으로, semaphore에 연결시킬 수 있었던 자원을 릴리스 하는 프로세스에 대응합니다.

•   sem_op 하지만 부의 경우의 동작은, semaphore의 현재의 값에 의존합니다.

    •   semaphore의 현재의 값이 sem_op 의 절대치와 동일한가 그것보다 큰 경우, semaphore의 값을 sem_op 의 절대치만 감소시킵니다. SEM_UNDO 하지만 지정되어 있는 경우, semaphore의 종료시 조정치를 sem_op 의 절대치만 증가시킵니다.

    •   semaphore의 현재가가 sem_op 의 값미만의 경우, 다음의 어떤 것인가가 발생합니다.

        •   IPC_NOWAIT (을)를 지정했을 경우, semop() (은)는 반환값 EAGAIN 그리고 즉시 복귀합니다.

        •   semctl() 의 IPC_RMID 옵션을 이용해, 다른 프로세스가 semaphore를 삭제해 버렸을 경우, semop() (은)는 반환값 EINVAL 그리고 즉시 복귀합니다.

        •   그 이외의 경우, semaphore의 값이 sem_op 의 절대치에 동일한가 그것보다 커질 때까지, 호출원프로세스는 휴면 상태가 됩니다. 이 조건이 실로 될 때, semaphore의 값을 sem_op 의 절대치만 감소시켜, semaphore의 종료시 조정치를 sem_op 의 절대치만 증가시킵니다.

        sem_op 하지만 부의 값일 때는, 일반적으로, 자원이 이용 가능하게 되는 것을 프로세스가 기다리고 있는 것에 됩니다.

•   sem_op 하지만 0 의 경우, 프로세스는 semaphore의 값이 0 이 되는 것을 기다립니다. 이미 0 의 경우는, semop() 의 호출로부터 즉시 복귀합니다. 그렇지 않은 경우, 호출원프로세스는, semaphore의 값이 0 이 될 때까지 휴면 상태가 됩니다.

프로세스가 사용하고 있는 semaphore 마다, 커널은, 먼저 말한 것처럼 「종료시 조정」치를 보관 유지합니다. 자발적이든 비자발적으로든, 프로세스가 종료할 경우에는, 각 semaphore에 대한 종료시 조정치가 semaphore의 값에 추가됩니다. 이것을, 프로세스가 예기 하지 않고 종료해 버리는 경우에 자원을 반드시 해방하는 것을 프로텍션하는데 사용 가능합니다.

반환값

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

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

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

[EAGAIN]
    semaphore의 값이 sem_op 미만으로, 한편 IPC_NOWAIT 하지만 지정되었습니다.

[E2BIG]
    너무나 많은 조작이 지정되었습니다.

[EFBIG]
    sem_num 하지만 집합에 대한 유효한 semaphore의 범위내에 없었습니다.

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