.\" Updated 2012-05-29, Akihiro MOTOKI <amotoki@gmail.com>
.\" Updated 2013-05-06, Akihiro MOTOKI <amotoki@gmail.com>
.\"
-.TH SEMOP 2 2013\-04\-17 Linux "Linux Programmer's Manual"
+.TH SEMOP 2 2014\-12\-31 Linux "Linux Programmer's Manual"
.SH 名前
semop, semtimedop \- System V セマフォの操作
.SH 書式
\fB#include <sys/ipc.h>\fP
\fB#include <sys/sem.h>\fP
.sp
-\fBint semop(int \fP\fIsemid\fP\fB, struct sembuf *\fP\fIsops\fP\fB, unsigned \fP\fInsops\fP\fB);\fP
+\fBint semop(int \fP\fIsemid\fP\fB, struct sembuf *\fP\fIsops\fP\fB, size_t \fP\fInsops\fP\fB);\fP
.sp
-\fBint semtimedop(int \fP\fIsemid\fP\fB, struct sembuf *\fP\fIsops\fP\fB, unsigned \fP\fInsops\fP\fB,\fP
-\fB struct timespec *\fP\fItimeout\fP\fB);\fP
+\fBint semtimedop(int \fP\fIsemid\fP\fB, struct sembuf *\fP\fIsops\fP\fB, size_t \fP\fInsops\fP\fB,\fP
+\fB const struct timespec *\fP\fItimeout\fP\fB);\fP
.fi
.sp
.in -4n
.sp
\fBsemtimedop\fP(): _GNU_SOURCE
.SH 説明
-System V セマフォ集合 (semaphore set) のメンバーの各セマフォは 以下の関連情報を持っている:
+System\ V セマフォ集合 (semaphore set) のメンバーの各セマフォは 以下の関連情報を持っている:
.sp
.in +4n
.nf
.in -4n
.fi
\fBsemop\fP() は \fIsemid\fP で指定されたセマフォ集合の選択されたセマフォに対して操作を行う。 \fIsops\fP は \fInsops\fP
-個の要素の配列を指し、配列の各要素は個々のセマフォに 対する操作を示す。その型は \fIstruct sembuf\fP で、次のメンバを持つ:
+個の要素の配列を指し、配列の各要素は個々のセマフォに対する操作を示す構造体である。その型は \fIstruct sembuf\fP で、次のメンバを持つ:
.sp
.in +4n
.nf
.IP \(bu
呼び出し元スレッドがシグナルを捕獲した: このとき \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
の絶対値以上の場合は、操作は直ちに実行される: \fIsemval\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) する。
+(このセマフォの値が増加するのを待っているスレッド数のカウンター) を 1 増加させて、以下のいずれかが起こるまでスレッドを停止 (sleep)
+する。
.IP \(bu 3
\fIsemval\fP が \fIsem_op\fP の絶対値以上になった。この時点で、操作は上述の通り実行される。
.IP \(bu
.IP \(bu
呼び出したスレッドがシグナルを捕獲した: このとき \fIsemncnt\fP が 1 減算され、 \fBsemop\fP() は失敗し \fIerrno\fP に
\fBEINTR\fP が設定される。
-.IP \(bu
-\fBsemtimedop\fP() の \fItimeout\fP で指定された制限時間が経過した: このとき \fBsemtimedop\fP() は失敗し、
-\fIerrno\fP に \fBEAGAIN\fP が設定される。
.PP
.\" and
.\" .I sem_ctime
操作が成功した場合、 \fIsops\fP が指す配列によって操作対象となった各セマフォの \fIsempid\fP メンバーには呼び出し元のプロセス ID
が設定される。さらに \fIsem_otime\fP に現在時刻が設定される。
-.PP
+.SS semtimedop()
\fBsemtimedop\fP() 関数の振る舞いは \fBsemop\fP() と全く同じだが、呼び出し元
スレッドが停止する場合、停止期間の上限が \fItimeout\fP 引き数の指す
\fItimespec\fP 構造体で指定された時間となる点だけが異なる (この停止期間は
\fBEAGAIN\fP が設定される (このとき \fIsops\fP の操作は実行されない)。
\fItimeout\fP 引き数が NULL の場合、 \fBsemtimedop\fP() 関数の振る舞いは
\fBsemop\fP() 関数と全く同じになる。
+
+\fBsemtimeop\fP() がシグナルにより割り込まれた場合、呼び出しはエラー \fBEINTR\fP で失敗し、 \fItimeout\fP
+の内容は変更されないままとなる点に注意すること。
.SH 返り値
成功した場合、 \fBsemop\fP() と \fBsemtimedop\fP() は 0 を返す。そうでなければ \-1 を返し、 エラーを示す
\fIerrno\fP を設定する。
セマフォ集合が存在しないか、 \fIsemid\fP が 0 未満であるか、 \fInsops\fP が正の数でない。
.TP
\fBENOMEM\fP
-ある操作で \fIsem_flg\fP に \fBSEM_UNDO\fP が指定されたが、システムにアンドゥ構造体に割り当てる十分なメモリがない。
+ã\81\82ã\82\8bæ\93\8dä½\9cã\81§ \fIsem_flg\fP ã\81« \fBSEM_UNDO\fP ã\81\8cæ\8c\87å®\9aã\81\95ã\82\8cã\81\9fã\81\8cã\80\81ã\82·ã\82¹ã\83\86ã\83 ã\81«ã\82¢ã\83³ã\83\89ã\82¥æ§\8bé\80 ä½\93ã\81«å\89²ã\82\8aå½\93ã\81¦ã\82\8bå\8d\81å\88\86ã\81ªã\83¡ã\83¢ã\83ªã\83¼ã\81\8cã\81ªã\81\84ã\80\82
.TP
\fBERANGE\fP
ある操作で \fIsem_op+semval\fP が \fBSEMVMX\fP より大きい。 \fBSEMVMX\fP は \fIsemval\fP
.\" 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
+ã\81®ã\82¤ã\83³ã\82¯ã\83«ã\83¼ã\83\89ã\81¯å¿\85è¦\81ã\81ªã\81\84ã\80\82ã\81\97ã\81\8bã\81\97ã\81ªã\81\8cã\82\89ã\80\81ã\81\84ã\81\8fã\81¤ã\81\8bã\81®å\8f¤ã\81\84å®\9fè£\85ã\81§ã\81¯ã\81\93ã\82\8cã\82\89ã\81®ã\83\98ã\83\83ã\83\80ã\83¼ã\83\95ã\82¡ã\82¤ã\83«ã\81®ã\82¤ã\83³ã\82¯ã\83«ã\83¼ã\83\89ã\81\8cå¿\85è¦\81ã\81§ã\81\82ã\82\8aã\80\81 SVID
でもこれらのインクルードをするように記載されている。このような古いシステムへの移植性を意図したアプリケーションではこれらのファイルをインクルードする必要があるかもしれない。
あるプロセスの \fIsem_undo\fP 構造体は \fBfork\fP(2) で生成された子プロセスには継承されないが、 \fBexecve\fP(2)
システムコールの場合は継承される。
.PP
-\fBsemop\fP() ã\81¯ã\82·ã\82°ã\83\8aã\83«ã\83\8fã\83³ã\83\89ã\83©ã\81«ã\82\88ã\81£ã\81¦ä¸æ\96ã\81\95ã\82\8cã\81\9få¾\8cã\81«ã\80\81 決ã\81\97ã\81¦è\87ªå\8b\95ç\9a\84ã\81«å\86\8dé\96\8bã\81\99ã\82\8bã\81\93ã\81¨ã\81¯ã\81ªã\81\84ã\80\82 ã\81\9fã\81¨ã\81\88ã\82·ã\82°ã\83\8aã\83«ã\83\8fã\83³ã\83\89ã\83©の設定時に
+\fBsemop\fP() ã\81¯ã\82·ã\82°ã\83\8aã\83«ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81«ã\82\88ã\81£ã\81¦ä¸æ\96ã\81\95ã\82\8cã\81\9få¾\8cã\81«ã\80\81 決ã\81\97ã\81¦è\87ªå\8b\95ç\9a\84ã\81«å\86\8dé\96\8bã\81\99ã\82\8bã\81\93ã\81¨ã\81¯ã\81ªã\81\84ã\80\82 ã\81\9fã\81¨ã\81\88ã\82·ã\82°ã\83\8aã\83«ã\83\8fã\83³ã\83\89ã\83©ã\83¼の設定時に
\fBSA_RESTART\fP フラグがセットされていても再開することはない
セマフォの調整値 (\fIsemadj\fP) は、プロセス毎のセマフォ毎の整数で、 \fBSEM_UNDO\fP
リストのそれぞれの値は \fBSEM_UNDO\fP を使って操作が行われた個々のセマフォに対応する。 プロセスが終了する際、 セマフォ毎の
\fIsemadj\fP の各々の値が対応するセマフォに加算される。 これにより、そのプロセスがそのセマフォに対して行った操作の影響が取り消される
(ただし、下記の「バグ」を参照)。 \fBsemctl\fP(2) の \fBSETVAL\fP や \fBSETALL\fP を使ってセマフォの値が直接設定された場合、
-すべてのプロセスの対応する \fIsemadj\fP の値がクリアされる。
-.PP
+すべてのプロセスの対応する \fIsemadj\fP の値がクリアされる。 \fBclone\fP(2) の \fBCLONE_SYSVSEM\fP フラグを使うと、
+複数のプロセスがひとつの \fIsemadj\fP リストを共有できる。 詳細は \fBclone\fP(2) を参照。
+
あるセマフォの \fIsemval\fP, \fIsempid\fP, \fIsemzcnt\fP, \fIsemnct\fP の値はいずれも、適切な操作を指定して
\fBsemctl\fP(2) を呼び出すことで取得できる。
-.PP
+.SS セマフォの上限
セマフォ集合のリソースに関する制限のうち、 \fBsemop\fP() に影響を及ぼすものを以下に挙げる:
.TP
\fBSEMOPM\fP
\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.63 の一部
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.78 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man\-pages/ に書かれている。