.\" Copyright 1993 Giorgio Ciucci (giorgio@crcc.it)
.\"
+.\" %%%LICENSE_START(VERBATIM)
.\" Permission is granted to make and distribute verbatim copies of this
.\" manual provided the copyright notice and this permission notice are
.\" preserved on all copies.
.\"
.\" Formatted or processed versions of this manual, if unaccompanied by
.\" the source, must acknowledge the copyright and authors of this work.
+.\" %%%LICENSE_END
.\"
.\" Modified 1996-10-22, Eric S. Raymond <esr@thyrsus.com>
.\" Modified 2002-01-08, Michael Kerrisk <mtk.manpages@gmail.com>
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
-.TH SEMOP 2 2008\-10\-04 Linux "Linux Programmer's Manual"
+.TH SEMOP 2 2013\-04\-17 Linux "Linux Programmer's Manual"
.SH 名前
-semop, semtimedop \- セマフォの操作
+semop, semtimedop \- System V セマフォの操作
.SH 書式
.nf
\fB#include <sys/types.h>\fP
.sp
\fBsemtimedop\fP(): _GNU_SOURCE
.SH 説明
-セマフォ集合 (semaphore set) のメンバーの各セマフォは 以下の関連情報を持っている:
+System V セマフォ集合 (semaphore set) のメンバーの各セマフォは 以下の関連情報を持っている:
.sp
.in +4n
.nf
unsigned short semval; /* セマフォ値 */
unsigned short semzcnt; /* ゼロを待つプロセス数 */
unsigned short semncnt; /* 増加を待つプロセス数 */
-pid_t sempid; /* 最後に操作を行なったプロセス */
+pid_t sempid; /* 最後に操作を行なったプロセスの ID */
.sp
.in -4n
.fi
それぞれの操作はセマフォ集合の \fIsem_num\fP番目 のセマフォに対して実行される。セマフォ集合の最初のセマフォには 番号 0 が振られる。
そして操作は三種類あり、 \fIsem_op\fP の値で区別される。
.PP
-\fIsem_op\fP が正の整数の場合、操作としてその値をセマフォの値 (\fIsemval\fP) に加える。さらにこの操作に \fBSEM_UNDO\fP
-ã\81\8cæ\8c\87å®\9aã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bå ´å\90\88ã\81¯ã\80\81ã\82·ã\82¹ã\83\86ã\83 ã\81¯ã\81\93ã\81®ã\82»ã\83\9eã\83\95ã\82©ã\81® ã\83\97ã\83ã\82»ã\82¹ã\83»ã\82¢ã\83³ã\83\89ã\82¥æ\95° (\fIsemadj\fP) ã\82\92æ\9b´æ\96°ã\81\99ã\82\8bã\80\82
-ã\81\93ã\81®æ\93\8dä½\9cã\81¯å¿\85ã\81\9aå®\9fè¡\8cã\81§ã\81\8dã\80\81ã\83\97ã\83ã\82»ã\82¹の停止は起こらない。 呼び出し元プロセスは対象のセマフォ集合を変更する許可がなければならない。
+\fIsem_op\fP が正の整数の場合、その値をセマフォの値 (\fIsemval\fP) に加算する。 さらに、この操作で \fBSEM_UNDO\fP
+ã\81\8cæ\8c\87å®\9aã\81\95ã\82\8cã\81¦ã\81\84ã\81\9få ´å\90\88ã\81¯ã\80\81 ã\82·ã\82¹ã\83\86ã\83 ã\81¯ã\81\93ã\81®ã\82»ã\83\9eã\83\95ã\82©ã\81®ã\81®èª¿æ\95´å\80¤ (\fIsemadj\fP) ã\81\8bã\82\89å\80¤ \fIsem_op\fP ã\82\92æ¸\9bç®\97ã\81\99ã\82\8bã\80\82 ã\81\93ã\81®æ\93\8dä½\9cã\81¯å¿\85ã\81\9aå®\9fè¡\8cã\81§ã\81\8dã\80\81
+ã\82¹ã\83¬ã\83\83ã\83\89の停止は起こらない。 呼び出し元プロセスは対象のセマフォ集合を変更する許可がなければならない。
.PP
\fIsem_op\fP が 0 の場合、「ゼロまで待つ」操作である。この場合、プロセスは そのセマフォ集合に対する読み込み許可がなければならない。
\fIsemval\fP が 0 ならば、操作は直ちに行われる。 \fIsemval\fP が 0 でない場合、 \fIsem_flg\fP に
\fBIPC_NOWAIT\fP が指定されていれば、 \fBsemop\fP() は失敗し、 \fBerrno\fP に \fBEAGAIN\fP が設定される (このとき
\fIsops\fP に対する操作は全く実行されない)。 \fIsem_flg\fP に \fBIPC_NOWAIT\fP が指定されていない場合、 \fIsemzcnt\fP
-(ã\82»ã\83\9eã\83\95ã\82©å\80¤ã\81\8c 0 ã\81«ã\81ªã\82\8bã\81®ã\82\92å¾\85ã\81£ã\81¦ã\81\84ã\82\8bã\83\97ã\83ã\82»ã\82¹ã\81®æ\95°) ã\82\92 1 å¢\97å\8a ã\81\95ã\81\9bã\81¦ã\80\81 以ä¸\8bã\81®ã\81\84ã\81\9aã\82\8cã\81\8bã\81\8cèµ·ã\81\93ã\82\8bã\81¾ã\81§ã\83\97ã\83ã\82»ã\82¹を停止 (sleep) する。
+(ã\82»ã\83\9eã\83\95ã\82©å\80¤ã\81\8c 0 ã\81«ã\81ªã\82\8bã\81®ã\82\92å¾\85ã\81£ã\81¦ã\81\84ã\82\8bã\82¹ã\83¬ã\83\83ã\83\89ã\81®æ\95°) ã\82\92 1 å¢\97å\8a ã\81\95ã\81\9bã\81¦ã\80\81 以ä¸\8bã\81®ã\81\84ã\81\9aã\82\8cã\81\8bã\81\8cèµ·ã\81\93ã\82\8bã\81¾ã\81§ã\82¹ã\83¬ã\83\83ã\83\89を停止 (sleep) する。
.IP \(bu 3
\fIsemval\fP が 0 になった: このとき \fIsemzcnt\fP の値は 1 減算される。
.IP \(bu
セマフォ集合が削除された: このとき \fBsemop\fP() は失敗し、 \fIerrno\fP に \fBEIDRM\fP が設定される。
.IP \(bu
-å\91¼ã\81³å\87ºã\81\97å\85\83ã\83\97ã\83ã\82»ã\82¹がシグナルを捕獲した: このとき \fIsemzcnt\fP の値は 1 減算され、 \fBsemop\fP() は失敗し \fIerrno\fP に
+å\91¼ã\81³å\87ºã\81\97å\85\83ã\82¹ã\83¬ã\83\83ã\83\89がシグナルを捕獲した: このとき \fIsemzcnt\fP の値は 1 減算され、 \fBsemop\fP() は失敗し \fIerrno\fP に
\fBEINTR\fP が設定される。
.IP \(bu
\fBsemtimedop\fP() の \fItimeout\fP で指定された制限時間が経過した: このとき \fBsemtimedop\fP() は失敗し、
\fIerrno\fP に \fBEAGAIN\fP が設定される。
.PP
\fIsem_op\fP が 0 未満の場合、プロセスにはそのセマフォ集合を変更する許可がなければ ならない。 \fIsemval\fP が \fIsem_op\fP
-ã\81®çµ¶å¯¾å\80¤ä»¥ä¸\8aã\81®å ´å\90\88ã\81¯ã\80\81æ\93\8dä½\9cã\81¯ç\9b´ã\81¡ã\81«å®\9fè¡\8cã\81\95ã\82\8cã\82\8b: \fIsemval\fP ã\81\8bã\82\89 \fIsem_op\fP ã\81®çµ¶å¯¾å\80¤ã\81\8cæ¸\9bç®\97ã\81\95ã\82\8cã\82\8bã\80\82 さらに、この操作に
-\fBSEM_UNDO\fP が指定されている場合は、このセマフォのプロセス・アンドゥ数 (\fIsemadj\fP) を更新する。 \fIsemval\fP が
-\fIsem_op\fP の絶対値より小さく、 \fIsem_flg\fP に \fBIPC_NOWAIT\fP が指定された場合は、 \fBsemop\fP() は失敗し、
-\fIerrno\fP に \fBEAGAIN\fP が設定される (このとき \fIsops\fP の操作は全く実行されない)。 \fBIPC_WAIT\fP
-が指定されていなければ、 \fIsemncnt\fP (このセマフォの値が増加するのを待っているプロセス数のカウンタ) を 1
-増加させて、以下のいずれかが起こるまでプロセスを停止 (sleep) する。
+ã\81®çµ¶å¯¾å\80¤ä»¥ä¸\8aã\81®å ´å\90\88ã\81¯ã\80\81æ\93\8dä½\9cã\81¯ç\9b´ã\81¡ã\81«å®\9fè¡\8cã\81\95ã\82\8cã\82\8b: \fIsemval\fP ã\81\8bã\82\89 \fIsem_op\fP ã\81®çµ¶å¯¾å\80¤ã\82\92æ¸\9bç®\97ã\81\97ã\80\81さらに、この操作に
+\fBSEM_UNDO\fP が指定されている場合は、このセマフォの調整値 (\fIsemadj\fP) に \fIsem_op\fP の絶対値を加算する。
+\fIsemval\fP が \fIsem_op\fP の絶対値より小さく、 \fIsem_flg\fP に \fBIPC_NOWAIT\fP が指定された場合は、
+\fBsemop\fP() は失敗し、 \fIerrno\fP に \fBEAGAIN\fP が設定される (このとき \fIsops\fP の操作は全く実行されない)。
+\fIsemval\fP が \fIsem_op\fP の絶対値より小さく、 \fBIPC_WAIT\fP が指定されていない場合は、 \fIsemncnt\fP
+(このセマフォの値が増加するのを待っているスレッド数のカウンタ) を 1 増加させて、以下のいずれかが起こるまでスレッドを停止 (sleep) する。
.IP \(bu 3
-\fIsemval\fP が \fIsem_op\fP の絶対値以上になった: このとき \fIsemncnt\fP が 1 減算され、 \fIsemval\fP から
-\fIsem_op\fP の絶対値が引かれる。 この操作に \fBSEM_UNDO\fP が指定されていた場合にはこのセマフォのプロセス・アンドゥ数
-(\fIsemadj\fP) も更新する。
+\fIsemval\fP が \fIsem_op\fP の絶対値以上になった。この時点で、操作は上述の通り実行される。
.IP \(bu
セマフォ集合がシステムから削除された: このとき \fBsemop\fP() は失敗し \fIerrno\fP に \fBEIDRM\fP が設定される。
.IP \(bu
-å\91¼ã\81³å\87ºã\81\97ã\81\9fã\83\97ã\83ã\82»ã\82¹がシグナルを捕獲した: このとき \fIsemncnt\fP が 1 減算され、 \fBsemop\fP() は失敗し \fIerrno\fP に
+å\91¼ã\81³å\87ºã\81\97ã\81\9fã\82¹ã\83¬ã\83\83ã\83\89がシグナルを捕獲した: このとき \fIsemncnt\fP が 1 減算され、 \fBsemop\fP() は失敗し \fIerrno\fP に
\fBEINTR\fP が設定される。
.IP \(bu
\fBsemtimedop\fP() の \fItimeout\fP で指定された制限時間が経過した: このとき \fBsemtimedop\fP() は失敗し、
.PP
.\" and
.\" .I sem_ctime
-操作が成功した場合、 \fIsops\fP が指す配列によって操作対象となった各セマフォの \fIsempid\fP メンバーには呼び出したプロセスのプロセス ID
-が設定される。 さらに \fIsem_otime\fP に現在時刻が設定される。
+操作が成功した場合、 \fIsops\fP が指す配列によって操作対象となった各セマフォの \fIsempid\fP メンバーには呼び出し元のプロセス ID
+が設定される。さらに \fIsem_otime\fP に現在時刻が設定される。
.PP
-\fBsemtimedop\fP() 関数の振る舞いは \fBsemop\fP() と全く同じだが、 呼び出し元プロセスが停止する場合、停止期間の上限が
-\fItimeout\fP 引き数の指す \fItimespec\fP 構造体で指定された時間となる点だけが異なる。 指定した制限時間に達した場合は、
-\fBsemtimedop\fP() は失敗し、 \fIerrno\fP に \fBEAGAIN\fP が設定される (このとき \fIsops\fP
-の操作は実行されない)。 \fItimeout\fP 引き数が NULL の場合、 \fBsemtimedop\fP() 関数の振る舞いは \fBsemop\fP()
-関数と全く同じになる。
+\fBsemtimedop\fP() 関数の振る舞いは \fBsemop\fP() と全く同じだが、呼び出し元
+スレッドが停止する場合、停止期間の上限が \fItimeout\fP 引き数の指す
+\fItimespec\fP 構造体で指定された時間となる点だけが異なる (この停止期間は
+システムクロックの粒度に切り上げられ、カーネルのスケジューリング遅延に
+より、この停止期間は少しだけ長くなる可能性がある)。
+指定した制限時間に達した場合は、 \fBsemtimedop\fP() は失敗し、 \fIerrno\fP に
+\fBEAGAIN\fP が設定される (このとき \fIsops\fP の操作は実行されない)。
+\fItimeout\fP 引き数が NULL の場合、 \fBsemtimedop\fP() 関数の振る舞いは
+\fBsemop\fP() 関数と全く同じになる。
.SH 返り値
成功した場合、 \fBsemop\fP() と \fBsemtimedop\fP() は 0 を返す。そうでなければ \-1 を返し、 エラーを示す
\fIerrno\fP を設定する。
セマフォ集合が削除された。
.TP
\fBEINTR\fP
-ã\81\93ã\81®ã\82·ã\82¹ã\83\86ã\83 ã\82³ã\83¼ã\83«ã\81§å\81\9cæ¢ã\81\97ã\81¦ã\81\84ã\82\8bæ\99\82ã\81«ã\83\97ã\83ã\82»ã\82¹ã\81\8cã\82·ã\82°ã\83\8aã\83«ã\82\92æ\8d\95ç\8d²ã\81\97ã\81\9fã\80\82 \fBsingle\fP(7) 参照。
+ã\81\93ã\81®ã\82·ã\82¹ã\83\86ã\83 ã\82³ã\83¼ã\83«ã\81§å\81\9cæ¢ã\81\97ã\81¦ã\81\84ã\82\8bæ\99\82ã\81«ã\82¹ã\83¬ã\83\83ã\83\89ã\81\8cã\82·ã\82°ã\83\8aã\83«ã\82\92æ\8d\95ç\8d²ã\81\97ã\81\9fã\80\82 \fBsingle\fP(7) 参照。
.TP
\fBEINVAL\fP
セマフォ集合が存在しないか、 \fIsemid\fP が 0 未満であるか、 \fInsops\fP が正の数でない。
.\" SVr4 documents additional error conditions EINVAL, EFBIG, ENOSPC.
SVr4, POSIX.1\-2001.
.SH 注意
+.\" Like Linux, the FreeBSD man pages still document
+.\" the inclusion of these header files.
+Linux や POSIX の全てのバージョンでは、 \fI<sys/types.h>\fP と \fI<sys/ipc.h>\fP
+のインクルードは必要ない。しかしながら、いくつかの古い実装ではこれらのヘッダファイルのインクルードが必要であり、 SVID
+でもこれらのインクルードをするように記載されている。このような古いシステムへの移植性を意図したアプリケーションではこれらのファイルをインクルードする必要があるかもしれない。
+
あるプロセスの \fIsem_undo\fP 構造体は \fBfork\fP(2) で生成された子プロセスには継承されないが、 \fBexecve\fP(2)
システムコールの場合は継承される。
.PP
\fBsemop\fP() はシグナルハンドラによって中断された後に、 決して自動的に再開することはない。 たとえシグナルハンドラの設定時に
\fBSA_RESTART\fP フラグがセットされていても再開することはない
-.PP
-\fIsemadj\fP はプロセスごとの整数で、 \fBSEM_UNDO\fP フラグを設定して実行された全てのセマフォ操作の(負数の)カウンタである。
-\fBsemctl\fP(2) に \fBSETVAL\fP または \fBSETALL\fP を指定し、セマフォの値が
-直接設定された場合には、全てのプロセスにおいて対応する \fIsemadj\fP の値がクリアされる。
+
+セマフォの調整値 (\fIsemadj\fP) は、プロセス毎のセマフォ毎の整数で、 \fBSEM_UNDO\fP
+フラグを指定して行われた、セマフォに対するすべての操作の合計値を反転したものである。 各プロセスは \fIsemadj\fP の値のリストを保持する \(em
+リストのそれぞれの値は \fBSEM_UNDO\fP を使って操作が行われた個々のセマフォに対応する。 プロセスが終了する際、 セマフォ毎の
+\fIsemadj\fP の各々の値が対応するセマフォに加算される。 これにより、そのプロセスがそのセマフォに対して行った操作の影響が取り消される
+(ただし、下記の「バグ」を参照)。 \fBsemctl\fP(2) の \fBSETVAL\fP や \fBSETALL\fP を使ってセマフォの値が直接設定された場合、
+すべてのプロセスの対応する \fIsemadj\fP の値がクリアされる。
.PP
あるセマフォの \fIsemval\fP, \fIsempid\fP, \fIsemzcnt\fP, \fIsemnct\fP の値はいずれも、適切な操作を指定して
\fBsemctl\fP(2) を呼び出すことで取得できる。
.\" http://marc.theaimsgroup.com/?l=linux-kernel&m=110260821123863&w=2
.\" the fix:
.\" http://marc.theaimsgroup.com/?l=linux-kernel&m=110261701025794&w=2
-ã\82«ã\83¼ã\83\8dã\83« 2.6.x (x <= 10) ã\81«ã\81¯ã\80\81ã\81\82ã\82\8bç\8a¶æ³\81ã\81«ã\81\8aã\81\84ã\81¦ã\82»ã\83\9eã\83\95ã\82©å\80¤ã\81\8c 0 ã\81«ã\81ªã\82\8bã\81®ã\82\92 å¾\85ã\81£ã\81¦ã\81\84ã\82\8bã\83\97ã\83ã\82»ã\82¹が、セマフォ値が実際に 0
+ã\82«ã\83¼ã\83\8dã\83« 2.6.x (x <= 10) ã\81«ã\81¯ã\80\81ã\81\82ã\82\8bç\8a¶æ³\81ã\81«ã\81\8aã\81\84ã\81¦ã\82»ã\83\9eã\83\95ã\82©å\80¤ã\81\8c 0 ã\81«ã\81ªã\82\8bã\81®ã\82\92 å¾\85ã\81£ã\81¦ã\81\84ã\82\8bã\82¹ã\83¬ã\83\83ã\83\89が、セマフォ値が実際に 0
になったときに起床 (wake up) されない、というバグがある。このバグはカーネル 2.6.11 で修正されている。
.SH 例
以下の部分的なコードは、 セマフォ 0 の値が 0 になるのを待ってから、 セマフォの値を 1 加算する処理を、 \fBsemop\fP()
}
.fi
.SH 関連項目
-\fBsemctl\fP(2), \fBsemget\fP(2), \fBsigaction\fP(2), \fBcapabilities\fP(7),
-\fBsem_overview\fP(7), \fBsvipc\fP(7), \fBtime\fP(7)
+\fBclone\fP(2), \fBsemctl\fP(2), \fBsemget\fP(2), \fBsigaction\fP(2),
+\fBcapabilities\fP(7), \fBsem_overview\fP(7), \fBsvipc\fP(7), \fBtime\fP(7)
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.53 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。