.\" Updated 2005-09-06, Akihiro MOTOKI
.\" Updated 2007-05-01, Akihiro MOTOKI, LDP v2.46
.\"
-.\"WORD: semaphore ¥»¥Þ¥Õ¥©
-.\"WORD: member ¥á¥ó¥Ð¡¼
-.\"WORD: process ¥×¥í¥»¥¹
-.\"WORD: system call ¥·¥¹¥Æ¥à¥³¡¼¥ë
-.\"WORD: undo ¥¢¥ó¥É¥¥
-.\"WORD: signal ¥·¥°¥Ê¥ë
-.\"WORD: catch Êá³Í(catch)
-.\"WORD: process-ID ¥×¥í¥»¥¹ID
-.\"WORD: policy Êý¿Ë
-.\"WORD: implement ¼ÂÁõ
-.\"WORD: queue ¥¥å¡¼
-.\"WORD: free ²òÊü(free).
-.\"WORD: memory ¥á¥â¥ê
-.\"WORD: anonymous structure ̵̾¹½Â¤ÂÎ
-.\"WORD: time limit À©¸Â»þ´Ö
+.\"WORD: semaphore ã\82»ã\83\9eã\83\95ã\82©
+.\"WORD: member ã\83¡ã\83³ã\83\90ã\83¼
+.\"WORD: process ã\83\97ã\83ã\82»ã\82¹
+.\"WORD: system call システムコール
+.\"WORD: undo ã\82¢ã\83³ã\83\89ã\82¥
+.\"WORD: signal シグナル
+.\"WORD: catch 捕獲(catch)
+.\"WORD: process-ID ã\83\97ã\83ã\82»ã\82¹ID
+.\"WORD: policy 方針
+.\"WORD: implement 実装
+.\"WORD: queue ã\82ã\83¥ã\83¼
+.\"WORD: free 解放(free).
+.\"WORD: memory メモリ
+.\"WORD: anonymous structure 無名構造体
+.\"WORD: time limit 制限時間
\"
.TH SEMOP 2 2008-10-04 "Linux" "Linux Programmer's Manual"
-.SH ̾Á°
-semop, semtimedop \- ¥»¥Þ¥Õ¥©¤ÎÁàºî
-.SH ½ñ¼°
+.SH 名前
+semop, semtimedop \- セマフォの操作
+.SH 書式
.nf
.B #include <sys/types.h>
.B #include <sys/ipc.h>
.fi
.sp
.in -4n
-glibc ¸þ¤±¤Îµ¡Ç½¸¡ºº¥Þ¥¯¥í¤ÎÍ×·ï
+glibc 向けの機能検査マクロの要件
.RB ( feature_test_macros (7)
-»²¾È):
+参照):
.in
.sp
.BR semtimedop ():
_GNU_SOURCE
-.SH ÀâÌÀ
-¥»¥Þ¥Õ¥©½¸¹ç (semaphore set) ¤Î¥á¥ó¥Ð¡¼¤Î³Æ¥»¥Þ¥Õ¥©¤Ï
-°Ê²¼¤Î´ØÏ¢¾ðÊó¤ò»ý¤Ã¤Æ¤¤¤ë:
+.SH 説明
+セマフォ集合 (semaphore set) のメンバーの各セマフォは
+以下の関連情報を持っている:
.sp
.in +4n
.nf
-unsigned short semval; /* ¥»¥Þ¥Õ¥©ÃÍ */
-unsigned short semzcnt; /* ¥¼¥í¤òÂÔ¤Ä¥×¥í¥»¥¹¿ô */
-unsigned short semncnt; /* Áý²Ã¤òÂÔ¤Ä¥×¥í¥»¥¹¿ô */
-pid_t sempid; /* ºÇ¸å¤ËÁàºî¤ò¹Ô¤Ê¤Ã¤¿¥×¥í¥»¥¹ */
+unsigned short semval; /* セマフォ値 */
+unsigned short semzcnt; /* ゼロを待つプロセス数 */
+unsigned short semncnt; /* 増加を待つプロセス数 */
+pid_t sempid; /* æ\9c\80å¾\8cã\81«æ\93\8dä½\9cã\82\92è¡\8cã\81ªã\81£ã\81\9fã\83\97ã\83ã\82»ã\82¹ */
.sp
.in -4n
.fi
.BR semop ()
-¤Ï
+は
.I semid
-¤Ç»ØÄꤵ¤ì¤¿¥»¥Þ¥Õ¥©½¸¹ç¤ÎÁªÂò¤µ¤ì¤¿¥»¥Þ¥Õ¥©¤ËÂФ·¤ÆÁàºî¤ò¹Ô¤¦¡£
+で指定されたセマフォ集合の選択されたセマフォに対して操作を行う。
.I sops
-¤Ï
+は
.I nsops
-¸Ä¤ÎÍ×ÁǤÎÇÛÎó¤ò»Ø¤·¡¢ÇÛÎó¤Î³ÆÍ×ÁǤϸġ¹¤Î¥»¥Þ¥Õ¥©¤Ë
-ÂФ¹¤ëÁàºî¤ò¼¨¤¹¡£¤½¤Î·¿¤Ï
+個の要素の配列を指し、配列の各要素は個々のセマフォに
+対する操作を示す。その型は
.I struct sembuf
-¤Ç¡¢¼¡¤Î¥á¥ó¥Ð¤ò»ý¤Ä:
+で、次のメンバを持つ:
.sp
.in +4n
.nf
-unsigned short sem_num; /* ¥»¥Þ¥Õ¥©ÈÖ¹æ */
-short sem_op; /* ¥»¥Þ¥Õ¥©Áàºî */
-short sem_flg; /* Áàºî¥Õ¥é¥° */
+unsigned short sem_num; /* セマフォ番号 */
+short sem_op; /* セマフォ操作 */
+short sem_flg; /* æ\93\8dä½\9cã\83\95ã\83©ã\82° */
.sp
.in -4n
.fi
.I sem_flg
-¤Ë¤Ï
+には
.B IPC_NOWAIT
-¤È
+と
.B SEM_UNDO
-¤¬ÀßÄê¤Ç¤¤ë¡£
+が設定できる。
.B SEM_UNDO
-¤¬»ØÄꤵ¤ì¤¿Áàºî¤Ï¡¢¤½¤Î¥×¥í¥»¥¹¤¬½ªÎ»¤·¤¿»þ¤Ë¼«Æ°Åª¤Ë¼è¤ê¾Ã¤µ¤ì¤ë¡£
+が指定された操作は、そのプロセスが終了した時に自動的に取り消される。
.PP
.I sops
-¤Ë´Þ¤Þ¤ì¤ëÁàºî¤Î½¸¹ç¤Ï¡¢
-.I "ÇÛÎó¤Î½ç½ø"
-¤Ç¡¢
-.I ¥¢¥È¥ß¥Ã¥¯¤Ë
-¼Â¹Ô¤µ¤ì¤ë¡£
-¤¹¤Ê¤ï¤Á¡¢Á´¤Æ¤ÎÁàºî¤¬´°Á´¤Ë¼Â¹Ô¤µ¤ì¤ë¤«¡¢Á´¤¯¼Â¹Ô¤µ¤ì¤Ê¤¤¤«¤Î
-¤É¤Á¤é¤«¤È¤Ê¤ë¡£
+に含まれる操作の集合は、
+.I "配列の順序"
+で、
+.I アトミックに
+実行される。
+すなわち、全ての操作が完全に実行されるか、全く実行されないかの
+どちらかとなる。
-Á´¤Æ¤ÎÁàºî¤¬Ä¾¤Á¤Ë¼Â¹Ô¤Ç¤¤Ê¤¤¾ì¹ç¤Î¤³¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤Î¿¶¤ëÉñ¤¤¤Ï
-¸Ä¡¹¤ÎÁàºî¤Î
+全ての操作が直ちに実行できない場合のこのシステムコールの振る舞いは
+個々の操作の
.I sem_flg
-¥Õ¥£¡¼¥ë¥É¤Ë
+フィールドに
.B IPC_NOWAIT
-¤¬Â¸ºß¤¹¤ë¤«¤Ë¤è¤Ã¤Æ·è¤Þ¤ê¡¢¸å½Ò¤Î¤è¤¦¤Ë¤Ê¤ë¡£
+が存在するかによって決まり、後述のようになる。
-¤½¤ì¤¾¤ì¤ÎÁàºî¤Ï¥»¥Þ¥Õ¥©½¸¹ç¤Î
-.IR sem_num ÈÖÌÜ
-¤Î¥»¥Þ¥Õ¥©¤ËÂФ·¤Æ¼Â¹Ô¤µ¤ì¤ë¡£¥»¥Þ¥Õ¥©½¸¹ç¤ÎºÇ½é¤Î¥»¥Þ¥Õ¥©¤Ë¤Ï
-ÈÖ¹æ 0 ¤¬¿¶¤é¤ì¤ë¡£
-¤½¤·¤ÆÁàºî¤Ï»°¼ïÎढ¤ê¡¢
+それぞれの操作はセマフォ集合の
+.IR sem_num 番目
+のセマフォに対して実行される。セマフォ集合の最初のセマフォには
+番号 0 が振られる。
+そして操作は三種類あり、
.I sem_op
-¤ÎÃͤǶèÊ̤µ¤ì¤ë¡£
+の値で区別される。
.PP
.I sem_op
-¤¬Àµ¤ÎÀ°¿ô¤Î¾ì¹ç¡¢Áàºî¤È¤·¤Æ¤½¤ÎÃͤò¥»¥Þ¥Õ¥©¤ÎÃÍ
+が正の整数の場合、操作としてその値をセマフォの値
.RI ( semval )
-¤Ë²Ã¤¨¤ë¡£¤µ¤é¤Ë¤³¤ÎÁàºî¤Ë
+に加える。さらにこの操作に
.B SEM_UNDO
-¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥·¥¹¥Æ¥à¤Ï¤³¤Î¥»¥Þ¥Õ¥©¤Î ¥×¥í¥»¥¹¡¦¥¢¥ó¥É¥¥¿ô
+が指定されている場合は、システムはこのセマフォの プロセス・アンドゥ数
.RI ( semadj )
-¤ò¹¹¿·¤¹¤ë¡£
-¤³¤ÎÁàºî¤Ïɬ¤º¼Â¹Ô¤Ç¤¡¢¥×¥í¥»¥¹¤ÎÄä»ß¤Ïµ¯¤³¤é¤Ê¤¤¡£
-¸Æ¤Ó½Ð¤·¸µ¥×¥í¥»¥¹¤ÏÂоݤΥ»¥Þ¥Õ¥©½¸¹ç¤òÊѹ¹¤¹¤ëµö²Ä¤¬¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
+を更新する。
+この操作は必ず実行でき、プロセスの停止は起こらない。
+呼び出し元プロセスは対象のセマフォ集合を変更する許可がなければならない。
.PP
.I sem_op
-¤¬ 0 ¤Î¾ì¹ç¡¢¡Ö¥¼¥í¤Þ¤ÇÂԤġ×Áàºî¤Ç¤¢¤ë¡£¤³¤Î¾ì¹ç¡¢¥×¥í¥»¥¹¤Ï
-¤½¤Î¥»¥Þ¥Õ¥©½¸¹ç¤ËÂФ¹¤ëÆɤ߹þ¤ßµö²Ä¤¬¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
+が 0 の場合、「ゼロまで待つ」操作である。この場合、プロセスは
+そのセマフォ集合に対する読み込み許可がなければならない。
.I semval
-¤¬ 0 ¤Ê¤é¤Ð¡¢Áàºî¤Ïľ¤Á¤Ë¹Ô¤ï¤ì¤ë¡£
+が 0 ならば、操作は直ちに行われる。
.I semval
-¤¬ 0 ¤Ç¤Ê¤¤¾ì¹ç¡¢
+が 0 でない場合、
.I sem_flg
-¤Ë
+に
.B IPC_NOWAIT
-¤¬»ØÄꤵ¤ì¤Æ¤¤¤ì¤Ð¡¢
+が指定されていれば、
.BR semop ()
-¤Ï¼ºÇÔ¤·¡¢
+は失敗し、
.B errno
-¤Ë
+に
.B EAGAIN
-¤¬ÀßÄꤵ¤ì¤ë (¤³¤Î¤È¤
+が設定される (このとき
.I sops
-¤ËÂФ¹¤ëÁàºî¤ÏÁ´¤¯¼Â¹Ô¤µ¤ì¤Ê¤¤)¡£
+に対する操作は全く実行されない)。
.I sem_flg
-¤Ë
+に
.B IPC_NOWAIT
-¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢
+が指定されていない場合、
.I semzcnt
-(¥»¥Þ¥Õ¥©Ãͤ¬ 0 ¤Ë¤Ê¤ë¤Î¤òÂԤäƤ¤¤ë¥×¥í¥»¥¹¤Î¿ô) ¤ò 1 Áý²Ã¤µ¤»¤Æ¡¢
-°Ê²¼¤Î¤¤¤º¤ì¤«¤¬µ¯¤³¤ë¤Þ¤Ç¥×¥í¥»¥¹¤òÄä»ß (sleep) ¤¹¤ë¡£
+(セマフォ値が 0 になるのを待っているプロセスの数) を 1 増加させて、
+以下のいずれかが起こるまでプロセスを停止 (sleep) する。
.IP \(bu 3
.I semval
-¤¬ 0 ¤Ë¤Ê¤Ã¤¿: ¤³¤Î¤È¤
+が 0 になった: このとき
.I semzcnt
-¤ÎÃÍ¤Ï 1 ¸º»»¤µ¤ì¤ë¡£
+の値は 1 減算される。
.IP \(bu
-¥»¥Þ¥Õ¥©½¸¹ç¤¬ºï½ü¤µ¤ì¤¿: ¤³¤Î¤È¤
+セマフォ集合が削除された: このとき
.BR semop ()
-¤Ï¼ºÇÔ¤·¡¢
+は失敗し、
.I errno
-¤Ë
+に
.B EIDRM
-¤¬ÀßÄꤵ¤ì¤ë¡£
+が設定される。
.IP \(bu
-¸Æ¤Ó½Ð¤·¸µ¥×¥í¥»¥¹¤¬¥·¥°¥Ê¥ë¤òÊá³Í¤·¤¿: ¤³¤Î¤È¤
+呼び出し元プロセスがシグナルを捕獲した: このとき
.I semzcnt
-¤ÎÃÍ¤Ï 1 ¸º»»¤µ¤ì¡¢
+の値は 1 減算され、
.BR semop ()
-¤Ï¼ºÇÔ¤·
+は失敗し
.I errno
-¤Ë
+に
.B EINTR
-¤¬ÀßÄꤵ¤ì¤ë¡£
+が設定される。
.IP \(bu
-.\" motoki: semop () ¤Ï semtimedop () ¤Î´Ö°ã¤¤¡©
+.\" motoki: semop () は semtimedop () の間違い?
.BR semtimedop ()
-¤Î
+の
.I timeout
-¤Ç»ØÄꤵ¤ì¤¿À©¸Â»þ´Ö¤¬·Ð²á¤·¤¿: ¤³¤Î¤È¤
+で指定された制限時間が経過した: このとき
.BR semtimedop ()
-¤Ï¼ºÇÔ¤·¡¢
+は失敗し、
.I errno
-¤Ë
+に
.B EAGAIN
-¤¬ÀßÄꤵ¤ì¤ë¡£
+が設定される。
.PP
.I sem_op
-¤¬ 0 ̤Ëþ¤Î¾ì¹ç¡¢¥×¥í¥»¥¹¤Ë¤Ï¤½¤Î¥»¥Þ¥Õ¥©½¸¹ç¤òÊѹ¹¤¹¤ëµö²Ä¤¬¤Ê¤±¤ì¤Ð
-¤Ê¤é¤Ê¤¤¡£
+が 0 未満の場合、プロセスにはそのセマフォ集合を変更する許可がなければ
+ならない。
.I semval
-¤¬
+が
.I sem_op
-¤ÎÀäÂÐÃͰʾå¤Î¾ì¹ç¤Ï¡¢Áàºî¤Ïľ¤Á¤Ë¼Â¹Ô¤µ¤ì¤ë:
+の絶対値以上の場合は、操作は直ちに実行される:
.I semval
-¤«¤é
+から
.I sem_op
-¤ÎÀäÂÐÃͤ¬¸º»»¤µ¤ì¤ë¡£
-¤µ¤é¤Ë¡¢¤³¤ÎÁàºî¤Ë
+の絶対値が減算される。
+さらに、この操作に
.B SEM_UNDO
-¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¤³¤Î¥»¥Þ¥Õ¥©¤Î¥×¥í¥»¥¹¡¦¥¢¥ó¥É¥¥¿ô
+が指定されている場合は、このセマフォのプロセス・アンドゥ数
.RI ( semadj )
-¤ò¹¹¿·¤¹¤ë¡£
+を更新する。
.I semval
-¤¬
+が
.I sem_op
-¤ÎÀäÂÐÃͤè¤ê¾®¤µ¤¯¡¢
+の絶対値より小さく、
.I sem_flg
-¤Ë
+に
.B IPC_NOWAIT
-¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¤Ï¡¢
+が指定された場合は、
.BR semop ()
-¤Ï¼ºÇÔ¤·¡¢
+は失敗し、
.I errno
-¤Ë
+に
.B EAGAIN
-¤¬ÀßÄꤵ¤ì¤ë (¤³¤Î¤È¤
+が設定される (このとき
.I sops
-¤ÎÁàºî¤ÏÁ´¤¯¼Â¹Ô¤µ¤ì¤Ê¤¤)¡£
+の操作は全く実行されない)。
.B IPC_WAIT
-¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¡¢
+が指定されていなければ、
.I semncnt
-(¤³¤Î¥»¥Þ¥Õ¥©¤ÎÃͤ¬Áý²Ã¤¹¤ë¤Î¤òÂԤäƤ¤¤ë¥×¥í¥»¥¹¿ô¤Î¥«¥¦¥ó¥¿)
-¤ò 1 Áý²Ã¤µ¤»¤Æ¡¢°Ê²¼¤Î¤¤¤º¤ì¤«¤¬µ¯¤³¤ë¤Þ¤Ç¥×¥í¥»¥¹¤òÄä»ß (sleep) ¤¹¤ë¡£
+(ã\81\93ã\81®ã\82»ã\83\9eã\83\95ã\82©ã\81®å\80¤ã\81\8cå¢\97å\8a ã\81\99ã\82\8bã\81®ã\82\92å¾\85ã\81£ã\81¦ã\81\84ã\82\8bã\83\97ã\83ã\82»ã\82¹æ\95°ã\81®ã\82«ã\82¦ã\83³ã\82¿)
+を 1 増加させて、以下のいずれかが起こるまでプロセスを停止 (sleep) する。
.IP \(bu 3
.I semval
-¤¬
+が
.I sem_op
-¤ÎÀäÂÐÃͰʾå¤Ë¤Ê¤Ã¤¿: ¤³¤Î¤È¤
+の絶対値以上になった: このとき
.I semncnt
-¤¬ 1 ¸º»»¤µ¤ì¡¢
+が 1 減算され、
.I semval
-¤«¤é
+から
.I sem_op
-¤ÎÀäÂÐÃͤ¬°ú¤«¤ì¤ë¡£
-¤³¤ÎÁàºî¤Ë
+の絶対値が引かれる。
+この操作に
.B SEM_UNDO
-¤¬»ØÄꤵ¤ì¤Æ¤¤¤¿¾ì¹ç¤Ë¤Ï¤³¤Î¥»¥Þ¥Õ¥©¤Î¥×¥í¥»¥¹¡¦¥¢¥ó¥É¥¥¿ô
+が指定されていた場合にはこのセマフォのプロセス・アンドゥ数
.RI ( semadj )
-¤â¹¹¿·¤¹¤ë¡£
+も更新する。
.IP \(bu
-¥»¥Þ¥Õ¥©½¸¹ç¤¬¥·¥¹¥Æ¥à¤«¤éºï½ü¤µ¤ì¤¿: ¤³¤Î¤È¤
+セマフォ集合がシステムから削除された: このとき
.BR semop ()
-¤Ï¼ºÇÔ¤·
+は失敗し
.I errno
-¤Ë
+に
.B EIDRM
-¤¬ÀßÄꤵ¤ì¤ë¡£
+が設定される。
.IP \(bu
-¸Æ¤Ó½Ð¤·¤¿¥×¥í¥»¥¹¤¬¥·¥°¥Ê¥ë¤òÊá³Í¤·¤¿: ¤³¤Î¤È¤
+呼び出したプロセスがシグナルを捕獲した: このとき
.I semncnt
-¤¬ 1 ¸º»»¤µ¤ì¡¢
+が 1 減算され、
.BR semop ()
-¤Ï¼ºÇÔ¤·
+は失敗し
.I errno
-¤Ë
+に
.B EINTR
-¤¬ÀßÄꤵ¤ì¤ë¡£
+が設定される。
.IP \(bu
-.\" motoki: the system call ¤Ï semtimedop () ¤Î¤³¤È¡©
+.\" motoki: the system call は semtimedop () のこと?
.BR semtimedop ()
-¤Î
+の
.I timeout
-¤Ç»ØÄꤵ¤ì¤¿À©¸Â»þ´Ö¤¬·Ð²á¤·¤¿: ¤³¤Î¤È¤
+で指定された制限時間が経過した: このとき
.BR semtimedop ()
-¤Ï¼ºÇÔ¤·¡¢
+は失敗し、
.I errno
-¤Ë
+に
.B EAGAIN
-¤¬ÀßÄꤵ¤ì¤ë¡£
+が設定される。
.PP
-Áàºî¤¬À®¸ù¤·¤¿¾ì¹ç¡¢
+操作が成功した場合、
.I sops
-¤¬»Ø¤¹ÇÛÎó¤Ë¤è¤Ã¤ÆÁàºîÂоݤȤʤ俳ƥ»¥Þ¥Õ¥©¤Î
+が指す配列によって操作対象となった各セマフォの
.I sempid
-¥á¥ó¥Ð¡¼¤Ë¤Ï¸Æ¤Ó½Ð¤·¤¿¥×¥í¥»¥¹¤Î¥×¥í¥»¥¹ ID ¤¬ÀßÄꤵ¤ì¤ë¡£
-¤µ¤é¤Ë
+メンバーには呼び出したプロセスのプロセス ID が設定される。
+さらに
.I sem_otime
-.\" ¤È
+.\" と
.\" .I sem_ctime
-¤Ë¸½ºß»þ¹ï¤¬ÀßÄꤵ¤ì¤ë¡£
+に現在時刻が設定される。
.PP
.BR semtimedop ()
-´Ø¿ô¤Î¿¶¤ëÉñ¤¤¤Ï
+関数の振る舞いは
.BR semop ()
-¤ÈÁ´¤¯Æ±¤¸¤À¤¬¡¢
-¸Æ¤Ó½Ð¤·¸µ¥×¥í¥»¥¹¤¬Ää»ß¤¹¤ë¾ì¹ç¡¢Ää»ß´ü´Ö¤Î¾å¸Â¤¬
+と全く同じだが、
+呼び出し元プロセスが停止する場合、停止期間の上限が
.I timeout
-°ú¤¿ô¤Î»Ø¤¹
+引き数の指す
.I timespec
-¹½Â¤ÂΤǻØÄꤵ¤ì¤¿»þ´Ö¤È¤Ê¤ëÅÀ¤À¤±¤¬°Û¤Ê¤ë¡£
-»ØÄꤷ¤¿À©¸Â»þ´Ö¤Ë㤷¤¿¾ì¹ç¤Ï¡¢
+構造体で指定された時間となる点だけが異なる。
+指定した制限時間に達した場合は、
.BR semtimedop ()
-¤Ï¼ºÇÔ¤·¡¢
+は失敗し、
.I errno
-¤Ë
+に
.B EAGAIN
-¤¬ÀßÄꤵ¤ì¤ë
-(¤³¤Î¤È¤
+が設定される
+(このとき
.I sops
-¤ÎÁàºî¤Ï¼Â¹Ô¤µ¤ì¤Ê¤¤)¡£
+の操作は実行されない)。
.I timeout
-°ú¤¿ô¤¬ NULL ¤Î¾ì¹ç¡¢
+引き数が NULL の場合、
.BR semtimedop ()
-´Ø¿ô¤Î¿¶¤ëÉñ¤¤¤Ï
+関数の振る舞いは
.BR semop ()
-´Ø¿ô¤ÈÁ´¤¯Æ±¤¸¤Ë¤Ê¤ë¡£
-.SH ÊÖ¤êÃÍ
-À®¸ù¤·¤¿¾ì¹ç¡¢
+関数と全く同じになる。
+.SH 返り値
+成功した場合、
.BR semop ()
-¤È
+と
.BR semtimedop ()
-¤Ï 0 ¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð \-1 ¤òÊÖ¤·¡¢
-¥¨¥é¡¼¤ò¼¨¤¹
+は 0 を返す。そうでなければ \-1 を返し、
+エラーを示す
.I errno
-¤òÀßÄꤹ¤ë¡£
-.SH ¥¨¥é¡¼
-¼ºÇÔ¤·¤¿¾ì¹ç¡¢
+を設定する。
+.SH ã\82¨ã\83©ã\83¼
+失敗した場合、
.I errno
-¤Ë°Ê²¼¤Î¤É¤ì¤«¤¬ÀßÄꤵ¤ì¤ë:
+に以下のどれかが設定される:
.TP
.B E2BIG
.I nsops
-°ú¤¿ô¤¬
+引き数が
.B SEMOPM
-¤è¤êÂ礤¤¡£
+より大きい。
.B SEMOPM
-¤Ï°ì²ó¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤Çµö¤µ¤ì¤ëÁàºî¤ÎºÇÂç¸Ä¿ô¤Ç¤¢¤ë¡£
+は一回のシステムコールで許される操作の最大個数である。
.TP
.B EACCES
-¸Æ¤Ó½Ð¤·¸µ¥×¥í¥»¥¹¤Ë¤Ï»ØÄꤵ¤ì¤¿¥»¥Þ¥Õ¥©Áàºî¤ò¹Ô¤¦¤Î¤Ë
-ɬÍפʥ¢¥¯¥»¥¹µö²Ä¤¬¤Ê¤¯¡¢
+呼び出し元プロセスには指定されたセマフォ操作を行うのに
+必要なアクセス許可がなく、
.B CAP_IPC_OWNER
-¥±¡¼¥Ñ¥Ó¥ê¥Æ¥£¤â¤Ê¤¤¡£
+ケーパビリティもない。
.TP
.B EAGAIN
-Áàºî¤òľ¤Á¤Ë½èÍý¤¹¤ë¤³¤È¤¬¤Ç¤¤º¡¢¤«¤Ä
+操作を直ちに処理することができず、かつ
.I sem_flg
-¤Ë
+に
.B IPC_NOWAIT
-¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¤«
+が指定されているか
.I timeout
-¤Ç»ØÄꤵ¤ì¤¿À©¸Â»þ´Ö¤¬·Ð²á¤·¤¿¡£
+で指定された制限時間が経過した。
.TP
.B EFAULT
-°ú¤¿ô
+引き数
.I sops
-¤«
+か
.I timeout
-¤¬»Ø¤·¤Æ¤¤¤ë¥¢¥É¥ì¥¹¤Ë¥¢¥¯¥»¥¹¤Ç¤¤Ê¤¤¡£
+が指しているアドレスにアクセスできない。
.TP
.B EFBIG
-¤¢¤ëÁàºî¤Ç¡¢
+ある操作で、
.I sem_num
-¤ÎÃͤ¬ 0 ̤Ëþ¤«¡¢½¸¹çÆâ¤Î¥»¥Þ¥Õ¥©¤Î¿ô°Ê¾å¤Ç¤¢¤ë¡£
+の値が 0 未満か、集合内のセマフォの数以上である。
.TP
.B EIDRM
-¥»¥Þ¥Õ¥©½¸¹ç¤¬ºï½ü¤µ¤ì¤¿¡£
+セマフォ集合が削除された。
.TP
.B EINTR
-¤³¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤ÇÄä»ß¤·¤Æ¤¤¤ë»þ¤Ë¥×¥í¥»¥¹¤¬¥·¥°¥Ê¥ë¤òÊá³Í¤·¤¿¡£
+このシステムコールで停止している時にプロセスがシグナルを捕獲した。
.BR single (7)
-»²¾È¡£
+参照。
.TP
.B EINVAL
-¥»¥Þ¥Õ¥©½¸¹ç¤¬Â¸ºß¤·¤Ê¤¤¤«¡¢
+セマフォ集合が存在しないか、
.I semid
-¤¬ 0 ̤Ëþ¤Ç¤¢¤ë¤«¡¢
+が 0 未満であるか、
.I nsops
-¤¬Àµ¤Î¿ô¤Ç¤Ê¤¤¡£
+が正の数でない。
.TP
.B ENOMEM
-¤¢¤ëÁàºî¤Ç
+ある操作で
.I sem_flg
-¤Ë
+に
.B SEM_UNDO
-¤¬»ØÄꤵ¤ì¤¿¤¬¡¢¥·¥¹¥Æ¥à¤Ë¥¢¥ó¥É¥¥¹½Â¤ÂΤ˳ä¤êÅö¤Æ¤ë½½Ê¬¤Ê¥á¥â¥ê¤¬¤Ê¤¤¡£
+が指定されたが、システムにアンドゥ構造体に割り当てる十分なメモリがない。
.TP
.B ERANGE
-¤¢¤ëÁàºî¤Ç
+ある操作で
.I sem_op+semval
-¤¬
+が
.B SEMVMX
-¤è¤êÂ礤¤¡£
+より大きい。
.B SEMVMX
-¤Ï
+は
.I semval
-¤ÎºÇÂçÃͤǡ¢¤½¤ÎÃͤϼÂÁõ°Í¸¤Ç¤¢¤ë¡£
-.SH ¥Ð¡¼¥¸¥ç¥ó
+の最大値で、その値は実装依存である。
+.SH バージョン
.BR semtimedop ()
-¤Ï Linux 2.5.52 ¤Ç½é¤á¤ÆÅо줷¡¢
-¤½¤ì¤«¤é¥«¡¼¥Í¥ë 2.4.22 ¤Ë¤â°Ü¿¢¤µ¤ì¤¿¡£
+は Linux 2.5.52 で初めて登場し、
+それからカーネル 2.4.22 にも移植された。
.BR semtimedop ()
-¤Î glibc ¤Ç¤Î¥µ¥Ý¡¼¥È¤Ï¥Ð¡¼¥¸¥ç¥ó 2.3.3 ¤Ç½é¤á¤ÆÅо줷¤¿¡£
-.SH ½àµò
+の glibc でのサポートはバージョン 2.3.3 で初めて登場した。
+.SH 準拠
SVr4, POSIX.1-2001.
-.\" SVr4 ¤Ë¤Ï¡¢ÄÉ²Ã¤Ç EINVAL, EFBIG, ENOSPC ¤Î¥¨¥é¡¼¾õÂ֤ˤĤ¤¤Æ¤Î
-.\" µ½Ò¤¬¤¢¤ë¡£
-.SH Ãí°Õ
-¤¢¤ë¥×¥í¥»¥¹¤Î
+.\" SVr4 には、追加で EINVAL, EFBIG, ENOSPC のエラー状態についての
+.\" 記述がある。
+.SH 注意
+あるプロセスの
.I sem_undo
-¹½Â¤ÂΤÏ
+構造体は
.BR fork (2)
-¤ÇÀ¸À®¤µ¤ì¤¿»Ò¥×¥í¥»¥¹¤Ë¤Ï·Ñ¾µ¤µ¤ì¤Ê¤¤¤¬¡¢
+で生成された子プロセスには継承されないが、
.BR execve (2)
-¥·¥¹¥Æ¥à¥³¡¼¥ë¤Î¾ì¹ç¤Ï·Ñ¾µ¤µ¤ì¤ë¡£
+システムコールの場合は継承される。
.PP
.BR semop ()
-¤Ï¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤Ë¤è¤Ã¤ÆÃæÃǤµ¤ì¤¿¸å¤Ë¡¢
-·è¤·¤Æ¼«Æ°Åª¤ËºÆ³«¤¹¤ë¤³¤È¤Ï¤Ê¤¤¡£
-¤¿¤È¤¨¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤ÎÀßÄê»þ¤Ë
+はシグナルハンドラによって中断された後に、
+決して自動的に再開することはない。
+たとえシグナルハンドラの設定時に
.B SA_RESTART
-¥Õ¥é¥°¤¬¥»¥Ã¥È¤µ¤ì¤Æ¤¤¤Æ¤âºÆ³«¤¹¤ë¤³¤È¤Ï¤Ê¤¤
+フラグがセットされていても再開することはない
.PP
.I semadj
-¤Ï¥×¥í¥»¥¹¤´¤È¤ÎÀ°¿ô¤Ç¡¢
+はプロセスごとの整数で、
.B SEM_UNDO
-¥Õ¥é¥°¤òÀßÄꤷ¤Æ¼Â¹Ô¤µ¤ì¤¿Á´¤Æ¤Î¥»¥Þ¥Õ¥©Áàºî¤Î(Éé¿ô¤Î)¥«¥¦¥ó¥¿¤Ç¤¢¤ë¡£
+フラグを設定して実行された全てのセマフォ操作の(負数の)カウンタである。
.BR semctl (2)
-¤Ë
+に
.B SETVAL
-¤Þ¤¿¤Ï
+または
.B SETALL
-¤ò»ØÄꤷ¡¢¥»¥Þ¥Õ¥©¤ÎÃͤ¬
-ľÀÜÀßÄꤵ¤ì¤¿¾ì¹ç¤Ë¤Ï¡¢Á´¤Æ¤Î¥×¥í¥»¥¹¤Ë¤ª¤¤¤ÆÂбþ¤¹¤ë
+を指定し、セマフォの値が
+直接設定された場合には、全てのプロセスにおいて対応する
.I semadj
-¤ÎÃͤ¬¥¯¥ê¥¢¤µ¤ì¤ë¡£
+の値がクリアされる。
.PP
-¤¢¤ë¥»¥Þ¥Õ¥©¤Î \fIsemval\fP, \fIsempid\fP, \fIsemzcnt\fP, \fIsemnct\fP
-¤ÎÃͤϤ¤¤º¤ì¤â¡¢Å¬ÀÚ¤ÊÁàºî¤ò»ØÄꤷ¤Æ
+あるセマフォの \fIsemval\fP, \fIsempid\fP, \fIsemzcnt\fP, \fIsemnct\fP
+の値はいずれも、適切な操作を指定して
.BR semctl (2)
-¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤Ç¼èÆÀ¤Ç¤¤ë¡£
+を呼び出すことで取得できる。
.PP
-¥»¥Þ¥Õ¥©½¸¹ç¤Î¥ê¥½¡¼¥¹¤Ë´Ø¤¹¤ëÀ©¸Â¤Î¤¦¤Á¡¢
+セマフォ集合のリソースに関する制限のうち、
.BR semop ()
-¤Ë±Æ¶Á¤òµÚ¤Ü¤¹¤â¤Î¤ò°Ê²¼¤Ëµó¤²¤ë:
+に影響を及ぼすものを以下に挙げる:
.TP
.B SEMOPM
-°ì²ó¤Î
+一回の
.BR semop ()
-¤Çµö¤µ¤ì¤ëÁàºî¤ÎºÇÂç¿ô (32)¡£
-(Linux ¤Ç¤Ï¡¢¤³¤ÎÀ©¸ÂÃͤÏ
+で許される操作の最大数 (32)。
+(Linux では、この制限値は
.I /proc/sys/kernel/sem
-¤ÎÂè3¥Õ¥£¡¼¥ë¥É¤ËÂбþ¤·¡¢Æɤ߽Ф·¤âÊѹ¹¤â¤Ç¤¤ë)¡£
-.\" ¤³¤Î /proc ¥Õ¥¡¥¤¥ë¤Ï Linux 2.2 °ÊÁ°¤Ç¤ÏÍøÍѤǤ¤Ê¤¤ -- MTK
+の第3フィールドに対応し、読み出しも変更もできる)。
+.\" この /proc ファイルは Linux 2.2 以前では利用できない -- MTK
.TP
.B SEMVMX
.I semval
-¤¬¼è¤êÆÀ¤ëºÇÂçÃÍ: ¼ÂÁõ°Í¸ (32767)¡£
+が取り得る最大値: 実装依存 (32767)。
.PP
-°Ê²¼¤ÎÃͤ˴ؤ·¤Æ¤Ï¼ÂÁõ°Í¸¤ÎÀ©¸Â¤Ï¤Ê¤¤¡£
-½ªÎ»»þ¤ÎÄ´À° (adjust on exit) ¤ÎºÇÂçÃÍ
-.RB ( SEMAEM )¡¢
-¥·¥¹¥Æ¥àÁ´ÂΤΥ¢¥ó¥É¥¥¹½Â¤ÂΤκÇÂç¿ô
-.RB ( SEMMNU )¡¢
-¥×¥í¥»¥¹¤¢¤¿¤ê¤Î¥¢¥ó¥É¥¥¹½Â¤ÂΤκÇÂç¿ô¡£
-.SH ¥Ð¥°
-¥×¥í¥»¥¹¤¬½ªÎ»¤¹¤ëºÝ¡¢¥×¥í¥»¥¹¤ËÂбþ¤¹¤ë
+以下の値に関しては実装依存の制限はない。
+終了時の調整 (adjust on exit) の最大値
+.RB ( SEMAEM )、
+システム全体のアンドゥ構造体の最大数
+.RB ( SEMMNU )、
+プロセスあたりのアンドゥ構造体の最大数。
+.SH ã\83\90ã\82°
+プロセスが終了する際、プロセスに対応する
.I semadj
-¤Î½¸¹ç¤ò»È¤Ã¤Æ¡¢
+の集合を使って、
.B SEM_UNDO
-¥Õ¥é¥°ÉÕ¤¤Ç¼Â¹Ô¤µ¤ì¤¿Á´¤Æ¤Î¥»¥Þ¥Õ¥©Áàºî¤Î±Æ¶Á¤ò¼è¤ê¾Ã¤¹¡£
-¤³¤ì¤Ë¤è¤ê¤¢¤ëÌäÂ꤬ȯÀ¸¤¹¤ë: ¤³¤ì¤é¤Î¥»¥Þ¥Õ¥©¤ÎÄ´À°¤ò¹Ô¤Ã¤Æ¤¤¤ë¤È¡¢
-Ãæ¤Ë¤Ï¥»¥Þ¥Õ¥©¤ÎÃͤ¬ 0 ̤Ëþ¤ÎÃͤˤ·¤è¤¦¤È¤¹¤ë¾ì¹ç¤¬½Ð¤Æ¤¯¤ë¡£
-¤³¤Î¤è¤¦¤Ê¾ì¹ç¡¢¤É¤Î¤è¤¦¤Ë¼ÂÁõ¤¹¤ë¤Ù¤¤«?
-¤Ò¤È¤Ä¤Î¹Í¤¨¤é¤ì¤ë¼êË¡¤Ï¡¢Á´¤Æ¤Î¥»¥Þ¥Õ¥©Ä´À°¤¬¼Â¹Ô¤µ¤ì¤ë¤Þ¤Ç
-Ää»ß¤¹¤ë¤³¤È¤Ç¤¢¤ë¡£¤·¤«¤·¡¢¤³¤ÎÊýË¡¤Ç¤Ï¥×¥í¥»¥¹¤Î½ªÎ»¤¬
-Ĺ»þ´Ö¤Ë¤ï¤¿¤Ã¤ÆÄä»ß¤µ¤ì¤ë¤³¤È¤¬¤¢¤ë¤Î¤Ç˾¤Þ¤·¤¯¤Ê¤¤¡£
-¤·¤«¤â¤É¤ì¤¯¤é¤¤Ä¹»þ´Ö¤Ë¤Ê¤ë¤«¤Ïʬ¤«¤é¤Ê¤¤¡£
-Ê̤ÎÁªÂò»è¤È¤·¤Æ¡¢¤³¤Î¤è¤¦¤Ê¥»¥Þ¥Õ¥©Ä´À°¤ò´°Á´¤Ë̵»ë¤·¤Æ¤·¤Þ¤¦ÊýË¡¤¬¤¢¤ë
-(¤³¤ì¤Ï¥»¥Þ¥Õ¥©Áàºî¤È¤·¤Æ
+フラグ付きで実行された全てのセマフォ操作の影響を取り消す。
+これによりある問題が発生する: これらのセマフォの調整を行っていると、
+中にはセマフォの値が 0 未満の値にしようとする場合が出てくる。
+このような場合、どのように実装するべきか?
+ひとつの考えられる手法は、全てのセマフォ調整が実行されるまで
+停止することである。しかし、この方法ではプロセスの終了が
+長時間にわたって停止されることがあるので望ましくない。
+しかもどれくらい長時間になるかは分からない。
+別の選択肢として、このようなセマフォ調整を完全に無視してしまう方法がある
+(これはセマフォ操作として
.B IPC_NOWAIT
-¤¬»ØÄꤹ¤ë¤Î¤È¾¯¤·»÷¤Æ¤¤¤ë)¡£
-Linux ¤ÏÂè»°¤Î¼êË¡¤òºÎÍѤ·¤Æ¤¤¤ë: ¥»¥Þ¥Õ¥©¤ÎÃͤò½ÐÍè¤ë¤À¤± (¤Ä¤Þ¤ê
-0 ¤Þ¤Ç) ¸º¾¯¤µ¤»¤Æ¡¢¥×¥í¥»¥¹¤Î½ªÎ»¤òľ¤Á¤Ë³¹Ô¤Ç¤¤ë¤è¤¦¤Ë¤·¤Æ¤¤¤ë¡£
+が指定するのと少し似ている)。
+Linux は第三の手法を採用している: セマフォの値を出来るだけ (つまり
+0 まで) 減少させて、プロセスの終了を直ちに続行できるようにしている。
-¥«¡¼¥Í¥ë 2.6.x (x <= 10) ¤Ë¤Ï¡¢¤¢¤ë¾õ¶·¤Ë¤ª¤¤¤Æ¥»¥Þ¥Õ¥©Ãͤ¬ 0 ¤Ë¤Ê¤ë¤Î¤ò
-ÂԤäƤ¤¤ë¥×¥í¥»¥¹¤¬¡¢¥»¥Þ¥Õ¥©Ãͤ¬¼ÂºÝ¤Ë 0 ¤Ë¤Ê¤Ã¤¿¤È¤¤Ëµ¯¾² (wake up)
-¤µ¤ì¤Ê¤¤¡¢¤È¤¤¤¦¥Ð¥°¤¬¤¢¤ë¡£¤³¤Î¥Ð¥°¤Ï¥«¡¼¥Í¥ë 2.6.11 ¤Ç½¤Àµ¤µ¤ì¤Æ¤¤¤ë¡£
-.\" ¥Ð¥°¥ì¥Ý¡¼¥È:
+カーネル 2.6.x (x <= 10) には、ある状況においてセマフォ値が 0 になるのを
+待っているプロセスが、セマフォ値が実際に 0 になったときに起床 (wake up)
+されない、というバグがある。このバグはカーネル 2.6.11 で修正されている。
+.\" バグレポート:
.\" http://marc.theaimsgroup.com/?l=linux-kernel&m=110260821123863&w=2
-.\" ½¤Àµ:
+.\" 修正:
.\" http://marc.theaimsgroup.com/?l=linux-kernel&m=110261701025794&w=2
-.SH Îã
-°Ê²¼¤ÎÉôʬŪ¤Ê¥³¡¼¥É¤Ï¡¢
-¥»¥Þ¥Õ¥© 0 ¤ÎÃͤ¬ 0 ¤Ë¤Ê¤ë¤Î¤òÂԤäƤ«¤é¡¢
-¥»¥Þ¥Õ¥©¤ÎÃͤò 1 ²Ã»»¤¹¤ë½èÍý¤ò¡¢
+.SH 例
+以下の部分的なコードは、
+セマフォ 0 の値が 0 になるのを待ってから、
+セマフォの値を 1 加算する処理を、
.BR semop ()
-¤ò»È¤Ã¤Æ¥¢¥È¥ß¥Ã¥¯ (atomically) ¤Ë¹Ô¤¦¡£
+を使ってアトミック (atomically) に行う。
.nf
struct sembuf sops[2];
exit(EXIT_FAILURE);
}
.fi
-.SH ´ØÏ¢¹àÌÜ
+.SH 関連項目
.BR semctl (2),
.BR semget (2),
.BR sigaction (2),