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.2.1R