217 lines
5.3 KiB
Groff
217 lines
5.3 KiB
Groff
.\"
|
|
.\" Copyright (c) 1995 David Hovemeyer <daveho@infocom.com>
|
|
.\"
|
|
.\" All rights reserved.
|
|
.\"
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
.\" modification, are permitted provided that the following conditions
|
|
.\" are met:
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
.\"
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR
|
|
.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
.\"
|
|
.\" %FreeBSD: src/lib/libc/sys/semop.2,v 1.7.2.4 2001/07/22 12:06:51 dd Exp %
|
|
.\"
|
|
.\" WORD: atomic 不可分な [POSIX]
|
|
.\" WORD: adjust on exit 終了時調整
|
|
.\" $FreeBSD: doc/ja_JP.eucJP/man/man2/semop.2,v 1.4 2001/05/14 01:08:24 horikawa Exp $
|
|
.Dd September 22, 1995
|
|
.Dt SEMOP 2
|
|
.Os FreeBSD
|
|
.Sh 名称
|
|
.Nm semop
|
|
.Nd セマフォ集合に対する不可分な操作の配列
|
|
.Sh ライブラリ
|
|
.Lb libc
|
|
.Sh 書式
|
|
.Fd #include <sys/types.h>
|
|
.Fd #include <sys/ipc.h>
|
|
.Fd #include <sys/sem.h>
|
|
.Ft int
|
|
.Fn semop "int semid" "struct sembuf array[]" "unsigned nops"
|
|
.Sh 解説
|
|
.Fn semop
|
|
は、
|
|
.Fa semid
|
|
が示すセマフォ集合に対して、
|
|
.Fa array
|
|
が示す操作の配列を不可分に実行します。
|
|
.Fa array
|
|
の長さは
|
|
.Fa nops
|
|
で示します。
|
|
各操作は
|
|
.Fa "struct sembuf"
|
|
内にエンコードされており、
|
|
.Fa "struct sembuf"
|
|
は次のように定義されます。
|
|
.Bd -literal
|
|
.\"
|
|
.\" From <sys/sem.h>
|
|
.\"
|
|
struct sembuf {
|
|
u_short sem_num; /* セマフォ番号 */
|
|
short sem_op; /* セマフォ操作 */
|
|
short sem_flg; /* 操作フラグ */
|
|
};
|
|
.Ed
|
|
.Pp
|
|
.Fa array
|
|
内の各要素に関し、
|
|
.Fa sem_op
|
|
と
|
|
.Fa sem_flg
|
|
は、集合内のセマフォ番号
|
|
.Fa sem_num
|
|
に対して実行される操作を決定します。
|
|
指定した操作の動作を変更するために、
|
|
SEM_UNDO
|
|
と
|
|
IPC_NOWAIT
|
|
の値の論理和
|
|
(
|
|
.Em OR
|
|
) を取って
|
|
.Fa sem_flg
|
|
メンバに入れることが可能です。
|
|
.Pp
|
|
実行される操作は次のように
|
|
.Fa sem_op
|
|
の値に依存します。
|
|
.\"
|
|
.\" This section is based on the description of semop() in
|
|
.\" Stevens, _Advanced Programming in the UNIX Environment_.
|
|
.\"
|
|
.Bl -bullet
|
|
.It
|
|
.Fa sem_op
|
|
が正の場合、セマフォの値を
|
|
.Fa sem_op
|
|
の値だけ増加させます。
|
|
SEM_UNDO
|
|
を指定した場合、セマフォの終了時調整値を
|
|
.Fa sem_op
|
|
の値だけ減少させます。
|
|
.Fa sem_op
|
|
についての正の値は、一般に、
|
|
セマフォに結び付けられた資源をリリースするプロセスに対応します。
|
|
.It
|
|
.Fa sem_op
|
|
が負の場合の動作は、セマフォの現在の値に依存します。
|
|
.Bl -bullet
|
|
.It
|
|
セマフォの現在の値が
|
|
.Fa sem_op
|
|
の絶対値と等しいかそれより大きい場合、セマフォの値を
|
|
.Fa sem_op
|
|
の絶対値だけ減少させます。
|
|
SEM_UNDO
|
|
が指定されている場合、セマフォの終了時調整値を
|
|
.Fa sem_op
|
|
の絶対値だけ増加させます。
|
|
.It
|
|
セマフォの現在値が
|
|
.Fa sem_op
|
|
の値未満の場合、次のどれかが発生します。
|
|
.\" XXX a *second* sublist?
|
|
.Bl -bullet
|
|
.It
|
|
IPC_NOWAIT
|
|
を指定した場合、
|
|
.Fn semop
|
|
は戻り値
|
|
.Er EAGAIN
|
|
でただちに復帰します。
|
|
.It
|
|
.Fn semctl
|
|
の
|
|
IPC_RMID
|
|
オプションを用いて、他のプロセスがセマフォを削除してしまった場合、
|
|
.Fn semop
|
|
は戻り値
|
|
.Er EINVAL
|
|
でただちに復帰します。
|
|
.It
|
|
それ以外の場合、セマフォの値が
|
|
.Fa sem_op
|
|
の絶対値に等しいかそれより大きくなるまで、
|
|
呼び出し元プロセスは休眠状態になります。
|
|
この条件が真になるとき、セマフォの値を
|
|
.Fa sem_op
|
|
の絶対値だけ減少させ、セマフォの終了時調整値を
|
|
.Fa sem_op
|
|
の絶対値だけ増加させます。
|
|
.El
|
|
.Pp
|
|
.Fa sem_op
|
|
が負の値であるときは、一般に、
|
|
資源が利用可能になるのをプロセスが待っていることに
|
|
なります。
|
|
.El
|
|
.Pp
|
|
.It
|
|
.Fa sem_op
|
|
が 0 の場合、プロセスはセマフォの値が 0 になるのを待ちます。
|
|
既に 0 の場合は、
|
|
.Fn semop
|
|
の呼び出しからただちに復帰します。
|
|
そうでない場合、呼び出し元プロセスは、セマフォの値が
|
|
0 になるまで休眠状態になります。
|
|
.El
|
|
.Pp
|
|
プロセスが使用しているセマフォごとに、カーネルは、
|
|
先に述べたように「終了時調整」値を保持します。
|
|
自発的であれ非自発的にであれ、プロセスが終了するときには、
|
|
各セマフォに対する終了時調整値がセマフォの値に追加されます。
|
|
これを、プロセスが予期せず終了してしまう場合に
|
|
資源を必ず解放することを保証するのに使用可能です。
|
|
.Sh 戻り値
|
|
正常に完了すると、
|
|
.Fn semop
|
|
は
|
|
0 を返します。そうでない場合、
|
|
-1 を返し、エラーを示すために
|
|
.Va errno
|
|
が設定されます。
|
|
.Sh エラー
|
|
.Fn semop
|
|
は次の場合に失敗します。
|
|
.Bl -tag -width Er
|
|
.It Bq Er EINVAL
|
|
.Fa semid
|
|
に対応するセマフォ集合がありません。
|
|
.It Bq Er EACCES
|
|
操作とセマフォ集合のモードの間で不一致があるため、
|
|
パーミッションが拒否されました。
|
|
.It Bq Er EAGAIN
|
|
セマフォの値が
|
|
.Fa sem_op
|
|
未満で、かつ
|
|
IPC_NOWAIT
|
|
が指定されました。
|
|
.It Bq Er E2BIG
|
|
あまりに多くの操作が指定されました。
|
|
.It Bq Er EFBIG
|
|
.\"
|
|
.\" I'd have thought this would be EINVAL, but the source says
|
|
.\" EFBIG.
|
|
.\"
|
|
.Fa sem_num
|
|
が集合に対する有効なセマフォの範囲内にありませんでした。
|
|
.El
|
|
.Sh 関連項目
|
|
.Xr semctl 2 ,
|
|
.Xr semget 2
|