.\"
.TH SEM_WAIT 3 2010-02-25 "Linux" "Linux Programmer's Manual"
.\"O .SH NAME
-.SH ̾Á°
+.SH 名前
.\"O sem_wait, sem_timedwait, sem_trywait \- lock a semaphore
-sem_wait, sem_timedwait, sem_trywait \- ¥»¥Þ¥Õ¥©¤ò¥í¥Ã¥¯¤¹¤ë
+sem_wait, sem_timedwait, sem_trywait \- セマフォをロックする
.\"O .SH SYNOPSIS
-.SH ½ñ¼°
+.SH 書式
.nf
.B #include <semaphore.h>
.sp
.sp
.sp
.\"O Link with \fI\-lrt\fP or \fI\-pthread\fP.
-\fI\-lrt\fP ¤Þ¤¿¤Ï \fI\-pthread\fP ¤Ç¥ê¥ó¥¯¤¹¤ë¡£
+\fI\-lrt\fP または \fI\-pthread\fP でリンクする。
.in -4n
.\"O Feature Test Macro Requirements for glibc (see
.\"O .BR feature_test_macros (7)):
-glibc ¸þ¤±¤Îµ¡Ç½¸¡ºº¥Þ¥¯¥í¤ÎÍ×·ï
+glibc 向けの機能検査マクロの要件
.RB ( feature_test_macros (7)
-»²¾È):
+参照):
.in
.sp
.BR sem_timedwait ():
_POSIX_C_SOURCE\ >=\ 200112L || _XOPEN_SOURCE\ >=\ 600
.\"O .SH DESCRIPTION
-.SH ÀâÌÀ
+.SH 説明
.\"O .BR sem_wait ()
.\"O decrements (locks) the semaphore pointed to by
.\"O .IR sem .
.\"O the decrement (i.e., the semaphore value rises above zero),
.\"O or a signal handler interrupts the call.
.BR sem_wait ()
-¤Ï
+は
.I sem
-¤¬»Ø¤¹¥»¥Þ¥Õ¥©¤ÎÃͤò 1 ¸º¤é¤¹ (¥í¥Ã¥¯¤¹¤ë)¡£
-¥»¥Þ¥Õ¥©¤ÎÃͤ¬ 0 ¤è¤êÂ礤¤¾ì¹ç¡¢¸º»»¤¬¼Â¹Ô¤µ¤ì¡¢´Ø¿ô¤Ïľ¤Á¤ËÉüµ¢¤¹¤ë¡£
-¥»¥Þ¥Õ¥©¤Î¸½ºßÃͤ¬ 0 ¤Î¾ì¹ç¤Ë¤Ï¡¢¸º»»¤ò¼Â¹Ô¤Ç¤¤ë¤è¤¦¤Ë¤Ê¤ë
-(¤Ä¤Þ¤ê¡¢¥»¥Þ¥Õ¥©¤ÎÃͤ¬ 0 ¤è¤êÂ礤ÊÃͤˤʤë) ¤Þ¤Ç¡¢¤â¤·¤¯¤Ï
-¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤Ë¤è¤Ã¤Æ¸Æ¤Ó½Ð¤·¤¬ÃæÃǤµ¤ì¤ë¤Þ¤Ç¡¢
-´Ø¿ô¸Æ¤Ó½Ð¤·¤ÏÄä»ß (block) ¤¹¤ë¡£
+が指すセマフォの値を 1 減らす (ロックする)。
+セマフォの値が 0 より大きい場合、減算が実行され、関数は直ちに復帰する。
+セマフォの現在値が 0 の場合には、減算を実行できるようになる
+(つまり、セマフォの値が 0 より大きな値になる) まで、もしくは
+シグナルハンドラによって呼び出しが中断されるまで、
+関数呼び出しは停止 (block) する。
.\"O .BR sem_trywait ()
.\"O is the same as
.\"O .BR EAGAIN )
.\"O instead of blocking.
.BR sem_trywait ()
-¤Ï
+は
.BR sem_wait ()
-¤ÈƱ¤¸¤À¤¬¡¢¥»¥Þ¥Õ¥©Ãͤθº»»¤ò¤¹¤°¤Ë¼Â¹Ô¤Ç¤¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë¡¢
-Ää»ß (block) ¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¥¨¥é¡¼¤ÇÉüµ¢¤¹¤ë
+と同じだが、セマフォ値の減算をすぐに実行できなかった場合に、
+停止 (block) するのではなくエラーで復帰する
.RI ( errno
-¤Ë
+に
.B EAGAIN
-¤¬¥»¥Ã¥È¤µ¤ì¤ë) ÅÀ¤¬°Û¤Ê¤ë¡£
+がセットされる) 点が異なる。
.\"O .BR sem_timedwait ()
.\"O is the same as
.\"O in seconds and nanoseconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC).
.\"O This structure is defined as follows:
.BR sem_timedwait ()
-¤Ï
+は
.BR sem_wait ()
-¤ÈƱ¤¸¤À¤¬¡¢¥»¥Þ¥Õ¥©Ãͤθº»»¤ò¤¹¤°¤Ë¼Â¹Ô¤Ç¤¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë
-´Ø¿ô¸Æ¤Ó½Ð¤·¤¬Ää»ß¤¹¤ë»þ´Ö¤Î¾å¸Â¤ò
+と同じだが、セマフォ値の減算をすぐに実行できなかった場合に
+関数呼び出しが停止する時間の上限を
.I abs_timeout
-¤Ç»ØÄꤹ¤ëÅÀ¤¬°Û¤Ê¤ë¡£
+で指定する点が異なる。
.I abs_timeout
-°ú¤¿ô¤Ï¡¢¥¿¥¤¥à¥¢¥¦¥È»þ¹ï¤ò»ØÄꤹ¤ë¹½Â¤ÂΤؤΥݥ¤¥ó¥¿¤Ç¤¢¤ë¡£
-¤³¤Î¹½Â¤ÂΤˤϡ¢¥¿¥¤¥à¥¢¥¦¥È»þ¹ï¤ò»þ¹ïµª¸µ (Epoch;
-1970-01-01 00:00:00 +0000 (UTC)) ¤«¤é¤Î
-·Ð²á»þ´Ö (ÉáܥʥÎÉÃ) ¤Ç»ØÄꤹ¤ë¡£
-¹½Â¤ÂΤϰʲ¼¤Î¤è¤¦¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ë:
+引き数は、タイムアウト時刻を指定する構造体へのポインタである。
+この構造体には、タイムアウト時刻を時刻紀元 (Epoch;
+1970-01-01 00:00:00 +0000 (UTC)) からの
+経過時間 (秒+ナノ秒) で指定する。
+構造体は以下のように定義されている:
.nf
.in +4n
.\"O .RI ( errno
.\"O set to
.\"O .BR ETIMEDOUT ).
-´Ø¿ô¸Æ¤Ó½Ð¤·»þÅÀ¤Ç¤¹¤Ç¤Ë¥¿¥¤¥à¥¢¥¦¥È¤Ë»ØÄꤷ¤¿»þ¹ï¤¬²á¤®¤Æ¤ª¤ê¡¢
-¤«¤Ä¥»¥Þ¥Õ¥©¤ò¤¹¤°¤Ë¥í¥Ã¥¯¤Ç¤¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢
+関数呼び出し時点ですでにタイムアウトに指定した時刻が過ぎており、
+かつセマフォをすぐにロックできなかった場合は、
.BR sem_timedwait ()
-¤Ï¥¿¥¤¥à¥¢¥¦¥È¥¨¥é¡¼
+ã\81¯ã\82¿ã\82¤ã\83 ã\82¢ã\82¦ã\83\88ã\82¨ã\83©ã\83¼
.RI ( errno
-¤Ë
+に
.B ETIMEDOUT
-¤¬¥»¥Ã¥È¤µ¤ì¤ë) ¤Ç¼ºÇÔ¤¹¤ë¡£
+がセットされる) で失敗する。
.\"O If the operation can be performed immediately, then
.\"O .BR sem_timedwait ()
.\"O Furthermore, the validity of
.\"O .I abs_timeout
.\"O is not checked in this case.
-¥»¥Þ¥Õ¥©Áàºî¤¬¤¹¤°¤Ë¼Â¹Ô¤Ç¤¤ë¤È¤¤Ï¡¢
+セマフォ操作がすぐに実行できるときは、
.I abs_timeout
-¤¬¤É¤ó¤ÊÃͤǤ¢¤Ã¤Æ¤â
+がどんな値であっても
.BR sem_timedwait ()
-¤¬¼ºÇÔ¤¹¤ë¤³¤È¤Ï·è¤·¤Æ¤Ê¤¤¡£¤µ¤é¤Ë¤¤¤¦¤È¡¢¤³¤Î¾ì¹ç¤Ë¤Ï
+が失敗することは決してない。さらにいうと、この場合には
.I abs_timeout
-¤ÎÀµÅöÀ¤Î¸¡ºº¤Ï¹Ô¤ï¤ì¤Ê¤¤¡£
+の正当性の検査は行われない。
.\"O .SH RETURN VALUE
-.SH ÊÖ¤êÃÍ
+.SH 返り値
.\"O All of these functions return 0 on success;
.\"O on error, the value of the semaphore is left unchanged,
.\"O \-1 is returned, and
.\"O .I errno
.\"O is set to indicate the error.
-À®¸ù¤¹¤ë¤È¡¢¤³¤ì¤é¤Î´Ø¿ô¤Ï 0 ¤òÊÖ¤¹¡£
-¥¨¥é¡¼¤Î¾ì¹ç¡¢¥»¥Þ¥Õ¥©¤ÎÃͤòÊѹ¹¤»¤º¤Ë¡¢\-1 ¤òÊÖ¤·¡¢
+成功すると、これらの関数は 0 を返す。
+エラーの場合、セマフォの値を変更せずに、\-1 を返し、
.I errno
-¤Ë¥¨¥é¡¼¤ò¼¨¤¹Ãͤò¥»¥Ã¥È¤¹¤ë¡£
+にエラーを示す値をセットする。
.\"O .SH ERRORS
-.SH ¥¨¥é¡¼
+.SH ã\82¨ã\83©ã\83¼
.TP
.B EINTR
.\"O The call was interrupted by a signal handler; see
.\"O .BR signal (7).
-¸Æ¤Ó½Ð¤·¤Ï¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤Ë¤è¤êÃæÃǤµ¤ì¤¿¡£
+呼び出しはシグナルハンドラにより中断された。
.BR signal (7)
-»²¾È¡£
+参照。
.TP
.B EINVAL
.\"O .I sem
.\"O is not a valid semaphore.
.I sem
-¤Ï͸ú¤Ê¥»¥Þ¥Õ¥©¤Ç¤Ê¤¤¡£
+は有効なセマフォでない。
.PP
.\"O The following additional error can occur for
.\"O .BR sem_trywait ():
.BR sem_trywait ()
-¤Î¾ì¹ç¤Ë¤Ï¡¢¾åµ¤Ë²Ã¤¨¤Æ°Ê²¼¤Î¥¨¥é¡¼¤âµ¯¤³¤ë¡£
+の場合には、上記に加えて以下のエラーも起こる。
.TP
.B EAGAIN
.\"O The operation could not be performed without blocking (i.e., the
.\"O semaphore currently has the value zero).
-Ää»ß (block) ¤»¤º¤Ë¥í¥Ã¥¯Áàºî¤ò´°Î»¤Ç¤¤Ê¤«¤Ã¤¿ (¤Ä¤Þ¤ê¡¢
-¥»¥Þ¥Õ¥©¤Î¸½ºß¤ÎÃͤ¬ 0 ¤Ç¤¢¤Ã¤¿)¡£
+停止 (block) せずにロック操作を完了できなかった (つまり、
+セマフォの現在の値が 0 であった)。
.PP
.\"O The following additional errors can occur for
.\"O .BR sem_timedwait ():
.BR sem_timedwait ()
-¤Î¾ì¹ç¡¢°Ê²¼¤Î¥¨¥é¡¼¤âµ¯¤³¤ë¡£
+の場合、以下のエラーも起こる。
.TP
.B EINVAL
.\"O The value of
.\"O .I abs_timeout.tv_nsecs
.\"O is less than 0, or greater than or equal to 1000 million.
.I abs_timeout.tv_nsecs
-¤ÎÃͤ¬ 0 ̤Ëþ¡¢¤â¤·¤¯¤Ï 1,000,000,000 °Ê¾å¤Ç¤¢¤ë¡£
+の値が 0 未満、もしくは 1,000,000,000 以上である。
.TP
.B ETIMEDOUT
.\"O The call timed out before the semaphore could be locked.
-¥»¥Þ¥Õ¥©¤Î¥í¥Ã¥¯¤ËÀ®¸ù¤¹¤ëÁ°¤Ë»þ´ÖÀÚ¤ì¤È¤Ê¤Ã¤¿¡£
+セマフォのロックに成功する前に時間切れとなった。
.\"O .\" POSIX.1-2001 also allows EDEADLK -- "A deadlock condition
.\"O .\" was detected", but this does not occur on Linux(?).
-.\" POSIX.1-2001 ¤Ç¤Ï¥¨¥é¡¼¤È¤·¤Æ EDEADLK ¤âÍÑ°Õ¤·¤Æ¤¤¤ë¡£
-.\" ¤³¤ì¤Ï¥Ç¥Ã¥É¥í¥Ã¥¯¾ò·ï¤ò¸¡½Ð¤·¤¿¤³¤È¤ò¼¨¤¹¤â¤Î¤À¤¬¡¢
-.\" Linux ¤ÇȯÀ¸¤¹¤ë¤³¤È¤Ï¤Ê¤¤(?)
+.\" POSIX.1-2001 ではエラーとして EDEADLK も用意している。
+.\" これはデッドロック条件を検出したことを示すものだが、
+.\" Linux で発生することはない(?)
.\"O .SH CONFORMING TO
POSIX.1-2001.
.\"O .SH NOTES
-.SH Ãí°Õ
+.SH 注意
.\"O A signal handler always interrupts a blocked call to
.\"O one of these functions, regardless of the use of the
.\"O .BR sigaction (2)
.\"O .B SA_RESTART
.\"O flag.
-¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤Ï¡¢
+シグナルハンドラは、
.BR sigaction (2)
-¤Î
+の
.B SA_RESTART
-¥Õ¥é¥°¤ò»ÈÍѤ·¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ë´Ø¤ï¤é¤º¡¢¤³¤ì¤é¤Î´Ø¿ô¤Î¸Æ¤Ó½Ð¤·¤¬
-Ää»ß¤·¤Æ¤¤¤ë¾ì¹ç¡¢¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤Ë¤è¤ê¾ï¤ËÃæÃǤµ¤ì¤ë¡£
+フラグを使用しているかどうかに関わらず、これらの関数の呼び出しが
+停止している場合、シグナルハンドラにより常に中断される。
.\"O .\" sem_wait() is always interrupted on most other implementations,
.\"O .\" but on FreeBSD 5.4 SA_RESTART does cause restarting.
-.\" sem_wait() ¤Ï¾¤Î¤Û¤È¤ó¤É¤Î¼ÂÁõ¤Ç¤Ï¾ï¤ËÃæÃǤµ¤ì¤ë¤¬¡¢
-.\" FreeBSD 5.4 ¤Ç¤Ï SA_RESTART ¤ò»ØÄꤷ¤Æ¤ª¤¯¤È¼Â¹Ô¤¬ºÆ³«¤µ¤ì¤ë¡£
+.\" sem_wait() は他のほとんどの実装では常に中断されるが、
+.\" FreeBSD 5.4 では SA_RESTART を指定しておくと実行が再開される。
.\"O .SH EXAMPLE
-.SH Îã
+.SH 例
.PP
.\"O The (somewhat trivial) program shown below operates on an
.\"O unnamed semaphore.
.\"O of the timeout, in seconds, for
.\"O .BR sem_timedwait ().
.\"O The following shows what happens on two different runs of the program:
-°Ê²¼¤Ë¼¨¤¹ (¤Á¤ç¤Ã¤È¤·¤¿) ¥×¥í¥°¥é¥à¤Ï̾Á°¤Ê¤·¥»¥Þ¥Õ¥©¤ÎÁàºî¤ò¹Ô¤¦¡£
-¥×¥í¥°¥é¥à¤Ï¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¤¿ô¤ò 2 ¤Ä¼è¤ë¡£
-ºÇ½é¤Î°ú¤¿ô¤Ë¤Ï¡¢
+以下に示す (ちょっとした) プログラムは名前なしセマフォの操作を行う。
+プログラムはコマンドライン引き数を 2 つ取る。
+最初の引き数には、
.B SIGALRM
-¥·¥°¥Ê¥ë¤òÀ¸À®¤¹¤ë¤¿¤á¤Î¥¢¥é¡¼¥à¥¿¥¤¥Þ¡¼¤ÎÀßÄê¤Ë»È¤ï¤ì¤ëÃͤò
-ÉÃñ°Ì¤Ç»ØÄꤹ¤ë¡£¤³¤Î¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤Ï¡¢
+シグナルを生成するためのアラームタイマーの設定に使われる値を
+秒単位で指定する。このシグナルハンドラは、
.I main()
-Æâ¤Ç
+内で
.BR sem_timedwait ()
-¤ò»È¤Ã¤ÆÂԤäƤ¤¤ë¥»¥Þ¥Õ¥©¤ò¡¢
+を使って待っているセマフォを、
.BR sem_post (3)
-¤ò»È¤Ã¤Æ²Ã»»¤¹¤ë¡£
-2ÈÖÌܤΰú¤¿ô¤Ë¤Ï¡¢
+を使って加算する。
+2番目の引き数には、
.BR sem_timedwait ()
-¤ËÅϤ¹¥¿¥¤¥à¥¢¥¦¥È¤Þ¤Ç¤Î»þ´Ö¤òÉÃñ°Ì¤Ç»ØÄꤹ¤ë¡£
+に渡すタイムアウトまでの時間を秒単位で指定する。
.in +4n
.nf
.fi
.in
.\"O .SS Program source
-.SS ¥×¥í¥°¥é¥à¤Î¥½¡¼¥¹
+.SS ã\83\97ã\83ã\82°ã\83©ã\83 ã\81®ã\82½ã\83¼ã\82¹
\&
.nf
#include <unistd.h>
}
.fi
.\"O .SH "SEE ALSO"
-.SH ´ØÏ¢¹àÌÜ
+.SH 関連項目
.BR clock_gettime (2),
.BR sem_getvalue (3),
.BR sem_post (3),