Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ semop(2V) — NEWS-os 4.1C

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

exec(2)

exit(2)

fork(2)

intro(2)

semctl(2V)

semget(2V)

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

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026