semop

Autres langues

Langue: ko

Version: November 1, 1993 (fedora - 25/11/07)

Section: 2 (Appels système)

이름

semop - 세마포어 조작.

사용법

 # include <sys/types.h>
 # include <sys/ipc.h>
 # include <sys/sem.h>
 

int semop ( int semid, struct sembuf *sops, unsigned nsops )

설명


 이 함수는 .IR semid에 의해 지시된 세마포어 세트 중 선택된 멤버들에 대한 연산들을 수행한다. sops가 가리키는 배열내의 .I nsops 요소들의 개별적인 것은 다음의 멤버들을 포함하는 .B "struct sembuf"에 의한 세마포어상에서 수행되는 연산을 명시한다.


      short sem_num;  
/* semaphore number: 0 = first */
      short sem_op;   
/* semaphore operation */
      short sem_flg;  
/* operation flags */

sem_flg에서 인식된 플래그들은 IPC_NOWAIT과 SEM_UNDO이다. 만일 연산이 .BR SEM_UNDO을 단언하면, 이는 프로세스가 빠져나갈때 실패할 것이다.

시스템 호출 의미는 만일 모든 것이 성공된다면, 연산들이 수행된다는 것을 보증한다. 세트 중 첫번째 세마포어가 0인 곳에서 연산들이 수행될 것이고 다음의 세가지 중 하나이다라는 것을 보증한다. Each operation is performed on the 각 연산은 세마포어 세트의 .BR sem_num -th 세마포어상(세트 중 첫번째 세마포어가 0인 곳에서)에서 수행되고, 다음의 세가지 중 하나이다.

만일 sem_op가 양수라면, 연산은 이 값을 .BR semval으로 추가시킨다. 더우기, 만일 SEM_UNDO가 이 연산에 대해 주장된다면, 시스템은 이 세마포어에 대한 프로세스 undo 카운트를 업데이트한다. 연산은 계속적으로 실행되고, 따라서 유휴하는 프로세스는 발생하지 않는다. 호출 프로세스는 세마포어 세트에 대해 변경 권한들을 갖고 있어야 한다.

만일 sem_op 이 zero이면, 프로세스는 세마포어 세트에 대한 읽기 접근 권한들을 갖고 있어야 한다. 만일 semval 이 제로라면, 연산은 실행된다. 그렇지 않으면, 만일 IPC_NOWAIT이 sem_flg내에서주장되면, EAGAIN으로설정된.Berrno에의해실패한다. 그렇지 않으면, semzcnt 은 하나씩 증가하고, 프로세스는 다음중 하나가 일어나기 전까지 유휴에 든다.

semval 은 .B semzcnt의 값이 감소하는 때에 0이 된다.
세마포어 세트는 삭제된다. 시스템 호출은 .BR EIDRM으로 설정된 .B errno에 의해 실패한다.
호출 프로세스는 감지되어야 하는 세마포어을 수신한다. semzcnt의 값은 감소되고, 시스템 호출은 .BR EINTR로 설정된 .B errno에 의해 실패한다.

만일 sem_op 이 0보다 낮다면, 프로세스는 세마포어 세트에 대한 변경 권한들을 갖고 있어야 한다. 만일 semval 이 .BR sem_op 의 절대값보다 높거나 동일하다면, sem_op의 절대값은 .BR semval에 의해 감소된다 . 더우기, 만일 SEM_UNDO이 이 연산에 대해 단언된다면, 시스템은 이 세마포어에 대한 프로세스 undo 카운트를 업데이트한다. 그리고나서, 연산은 계속된다. 그렇지 않고, 만일 Otherwise, if IPC_NOWAIT이 .BR sem_flg내에서 단언된다면, 시스템 호출은.BR EAGAIN로 설정된 .B errno에 의해 실패한다.(수행된 이전의 액션들을 취소함으로서) 그렇지 않으면, Otherwise semncnt는 하나에 의해 증가되고, 프로세스는 다음 중 하나가 발생하기 전까지 유휴한다.

semval 는 .BR sem_op의 절대값보다 동일하거나 더 높아진다. semncnt의 값이 감소될때, .B sem_op의 절대값은 .B semval에서 감해진다. 그리고 SEM_UNDO이 이 연산에 대해 주장되면, 시스템은 세마포어에 대한 프로세스 undo 카운트를 업데이트한다.
세마포어 세트는 시스템에서 삭제된다. 시스템 호출은 .BR EIDRM으로 설정된 .B errno에 의해 실패한다.
호출 프로세스는 감지되어야 한는 세마포어을 수신한다. .B semncnt의 값은 감소되고, 시스템 호출은 .BR EINTR으로 설정된 .B errno에 의해 실패한다.

In case of success, the 성공할 경우, .I sops에 의해 지시된 배열내에 명시된 개별 세마포어에 대한 구조 .B sem의 sempid 멤버는 호출 프로세스의 process-ID 로 설정된다. 더욱이, .B sem_otime 와 .B sem_ctime 모두 현재 시간으로 설정된다.

반환값

If successful the system call returns 만일 성공적이면, 시스템 호출은 .BR 0을 리턴하고, 그렇지 않으면, 에러를 가리키는 .B errno와 함께 .B -1를 리턴한다.

에러

실패하는 리턴에 대하여, errno는 다음의 값들중 하나로 설정될 것이다.
E2BIG
인수 .I nsops는 .BR SEMOPM, 즉 시스템 호출마다 허용된 연산들 중 최대 숫자보다 더 크다.
EACCES
호출 프로세스는 명시된 연산들 중 하나에 의해 요구되는 세마포어 세트에 대한 접근 권한을 갖고 있지 않는다.
EAGAIN
연산은 실행되지 않고, .BR IPC_NOWAIT는 sem_flg내에주장된다.
EFAULT
sops이 가리키는 주소는 접근이 불가능하다.
EFBIG
일부 연산에 대하여, .B sem_num 값은 0 보다 적거나, 이 세트에서 세마포어의 숫자들 보다 크거나 동일하다.
EIDRM
세마포어 세트는 삭제되었다.
EINTR
대기 열에서 유휴시, 프로세스는 감지되어야 하는 세마포어을 수신한다.
EINVAL
세마포어 세트는 존재하지 않거나, .I semid는 0보다 작거나, nsops는 정수가 아닌 값을 갖는다.
ENOMEM
단언된 .B sem_flg 일부 연산의 .B SEM_UNDO와 시스템은 undo 구조를 할당할 충분한 메모리를 갖고 있지 않다.
ERANGE
일부 연산에 대하여, semop+semval는 .BR semval에 대한 구현 의존적인 최대값인 .BR SEMVMX보다 더크다. ,

주의

프로세스의 .B sem_undo 구조들은 .BR fork (2) 시스템 호출의 실행에서 자식 프로세스에 의해 상속되지 않는다. 대신에 이 구조들은 .BR execve (2) 시스템 호출의 실행에 의해 결과적인 대체 프로세스에 의해 상속된다.

다음들은 세마포어 세트상에서 .B semop 호출에 영향을 미침으로서 자원에 대한 한계이다.

SEMOPM
하나의 .B semop 호출에 대해 허용된 연산들의 최대 숫자. 정책 의존적이다.
SEMVMX
semval에대해최대로허용된값.구현의존적이다(32767).

버그

시스템은 undo 요청으로 프로세스에 의해 변경된 개별 세마포어에 대한 개별 프로세스 .B sem_undo 구조를 관리한다. 이러한 구조들은 프로세스 exit에 자유롭다. undo 메커니즘에 있어 잘못된 점의 주요한 원인은 연산의 극소 세트를 세마포머의 배열로 만드는 관념에 적합하게 한다는데 있다. 수많은 배열 및 개별 세마포어에 대한 undo 요청들은 .B semopt 호출들 위에 축적될 수 있다. 빠져나갈때, 프로세스가 잠자고 있어야 하는가? 또는 모든 undo 연산들이 .B IPC_NOWAIT 플래그에 효력이 될 수 있도록 적용되어야 하는가? 즉시 적용되어야 하는 현재의 undo 연산들은 기다림이 필요한 연산들은 무시된다. 따라서, 악의 없는 undo의 활용은 사적인 세마포어에 의해서만 보증된다.

호환

SVr4, SVID. SVr4는 EINVAL, EFBIG, ENOSPC의 추가 에러 조건들에 대한 문서를 제공한다.

관련 항목

ipc(5), semctl(2), semget(2)

역자

ASPLINUX<man@asp-linux.co.kr>, 2000년 7월 29일 배성훈<plodder@kldp.org>, 2000년 11월 18일