SEMOP(2V) — NEWS-OS Programmer’s Manual
名称
semop − セマフォの操作
形式
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semop (semid, sops, nsops)
int semid;
struct sembuf ∗∗sops;
int nsops;
解説
Semop は semid によって指定する セマフォ識別子に対応する セマフォのセットに対しての複数の操作 を自動的に行うために使用されます。 Sops はセマフォ操作構造体の配列 へのポインタとなります。 Nsops は配列内の構造体の数です。 構造体は以下のようなメンバー から構成されます。
shortsem_num;/∗ セマフォ数 ∗/
shortsem_op;/∗ セマフォ操作 ∗/
shortsem_flg;/∗ 操作フラグ ∗/
sem_op で指定する 各セマフォの操作は semid および sem_num で指定するセマフォ に対応して行われます。
Sem_op は以下に示す3つのセマフォ操作の1つを 指定します。
sem_op が負の整数のとき、 以下の内の1つが発生します。
semval ( intro(2) 参照) が sem_op の絶対値以上のとき、 sem_op の絶対値が semvalから引かれる。 さらに、 (sem_flg & SEM_UNDO) が真のときには、 sem_op の絶対値が 指定セマフォに対する呼びだし プロセスの semadjの値 ( exit(2) 参照) に付加される。
semvalが sem_op の絶対値より小さくて、 (sem_flg & IPC_NOWAIT) が真のとき、 semop からすぐに返る。
semvalが sem_op の絶対値より小さくて、 (sem_flg & IPC_NOWAIT) が偽のときには、 semop は 以下の条件の1つが発生するまで、 指定セマフォに対応する semncntを1増やし、 呼びだしプロセスの実行を停止する。
semvalが sem_op の絶対値以上 になった場合、 指定セマフォに対応する semncntの値が1減らされ、 sem_op の絶対値がsemvalより引かる。 そして、 (sem_flg & SEM_UNDO) が真のときには、 sem_op の絶対値が呼出しプロセスの指定セマフォの semadjの値に加算されます。
呼びだしプロセスが待っている semidがシステムより取り除かれる ( semctl(2V) 参照)と、 errno が EIDRM, に対応して設定され、 −1が返される。
呼びだしプロセスが シグナルを受信すると、 指定セマフォに対応する semncntの値が減らされ、 呼びだしプロセスは signal(2) で述られている方法で 実行を再開する。
sem_op が正の整数のとき、 sem_op の値がsemvalに加算され、 (sem_flg & SEM_UNDO) が真のとき、 呼びだしプロセス の指定セマフォに対する semadjの値から sem_op の値が引かれます。
sem_op がゼロのとき、 以下の内のどれかとなります。
semvalがゼロのとき、 semop からすぐに返る。
semvalがゼロでなく、 (sem_flg & IPC_NOWAIT) が真のとき、 semop からすぐに返る。
semvalがゼロでなく、 (sem_flg & IPC_NOWAIT) が偽のとき、 semop は以下の内の1つが発生するまで 指定セマフォに対応する semzcntを1増やし、 呼びだしプロセスの実行を停止する。
semval がゼロになると、指定セマフォに対応するsemzcnt の値が1減らされる。
呼びだしプロセスが待っている semidがシステムより取り除かれると、 EIDRM の errno が設定され、 −1が返される。
呼びだしプロセスがシグナルを受信 すると、 指定セマフォに対応する semzcntの値から1減らされ、 signal(2) で述べられている方法で呼びだしプロセス は実行を再開する。
sops によって指定されるどのセマフォ 操作についても 以下の1つでも該当するときには、 Semop の実行は失敗します。
[EINVAL]
Semid が有効なセマフォ識別子でない。
[EFBIG] Sem_num が0より小さいか semid に対応するセットのセマフォ の数以上である。
[E2BIG] Nsops がシステムの最大値以上である。
[EACCES] 操作許可が呼びだしプロセス に対して認められない ( intro(2) 参照)。
[EAGAIN] 操作の結果が呼びだしプロセスの停止となったが (sem_flg & IPC_NOWAIT) が真である。
[ENOSPC] SEM_UNDO を要求しているプロセスの数が最大値を 超えている。
[EINVAL] 呼だしプロセスが SEM_UNDO を要求している セマフォの数が 最大値を超えている。
[ERANGE] semvalの値が システムの最大値を超えた。
[ERANGE] semadjの値が システムの最大値を超えた。
[EFAULT] Sops が不正アドレスを示している。
コマンド成功時には、 sops によって示される配列の 各セマフォの sempidの値が 呼びだしプロセスの ID に設定されます。
リターン値
シグナルの受信により semop から返ると、 −1が呼びだしプロセス に返り、 errno が EINTR に設定されます。 システムから semid が取り除かれたために返った場合、 −1が返され、 errno が EIDRM に設定されます。
コマンド成功時には、 sops によって指定する配列の最後の操作が行われた時の semval の値が返ります。 失敗した場合、 −1が返り、 errno がエラーを示します。
関連事項
exec(2), exit(2), fork(2), intro(2), semctl(2V), semget(2V).
NEWS-OSRelease 4.1C