.\" .\" Copyright (c) 1996 Joerg Wunsch .\" .\" 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/share/man/man9/sleep.9,v 1.43.2.1 2005/01/10 08:27:21 cperciva Exp % .\" $FreeBSD$ .\" " .Dd December 17, 1998 .Os .Dt SLEEP 9 .Sh 名称 .Nm sleep , .Nm msleep , .Nm tsleep , .Nm wakeup .Nd イベントのウェイト .Sh 書式 .In sys/param.h .In sys/systm.h .In sys/proc.h .Ft int .Fn tsleep "void *ident" "int priority" "const char *wmesg" "int timo" .Ft int .Fn msleep "void *ident" "struct mtx *mtx" "int priority" "const char *wmesg" "int timo" .Ft void .Fn wakeup "void *ident" .Ft void .Fn wakeup_one "void *ident" .Sh 解説 関数 .Fn tsleep および .Fn wakeup はイベントに基づいたプロセスのブロックを取り扱います。 プロセスが外部イベントを待たなければならない場合には、そのプロセスは .Fn tsleep によってスリープ状態に置かれます。 パラメータ .Fa ident は、プロセスがどのイベント上でスリープしているかを識別する一意的な 任意のアドレスです。 単一の .Fa ident 上でスリープしている全てのプロセスは後で、 .Fn wakeup によって起こされます。 これは、しばしば割り込みルーチンの中から呼び出され、 プロセスがブロックしているリソースが現在利用可能になったことを示します。 .Pp パラメータ .Fa wmesg は .Xr ps 1 のようなツールのためのスリープ状態を解説する文字列です。 これらのプログラムの任意の文字列を表示するための領域の制限のため、 このメッセージは 6 文字を超えるべきではありません。 .Pp .Fn wakeup_one 関数はパラメータ .Fa ident 上でスリープしているキューの中の最初のプロセスを実行可能に するために使用されます。 これは、多数のプロセスが同じアドレス上でスリープしているが、 実行可能となったときその中の 1 つのみが実際には役に立つ作業ができるときに、 システムが飽和することを防ぐことが可能です。 .Pp .Fn tsleep 関数は一般的なスリープの呼び出しです。 明示された識別子上の wakeup が実行されるまでの間、 現在のプロセスを一時停止させます。 それからそのプロセスは明示された優先度 .Fa priority で実行可能にされます。 長くて .Fa timo \&/ hz 秒間 (0 はタイムアウトなしを意味します) スリープします。 .Va Giant ロックが保持されていないなら、 .Fa timo は 0 以外でなければなりません。 .Fa priority が .Dv PCATCH フラグを含む場合には、スリープの前後でシグナルがチェックされます。 そうでない場合には、シグナルはチェックされません。 起こされた場合には 0 を返し、タイムアウトが経過した場合には .Er EWOULDBLOCK を返します。 .Dv PCATCH が設定されていてシグナルが配信される必要がある場合で、 可能であれば現在のシステムコールが再開始されるべきである場合には .Er ERESTART が返され、 .Er ( EINTR を返す) シグナルによってそのシステムコールが中断されるべき場合には .Er EINTR が返されます。 .Pp .Fn msleep 関数は tsleep の変種です。 パラメータ .Fa mtx は、スリープの前に抜け、 .Fn msleep が戻る前に入る mutex です。 .Fa priority が .Dv PDROP フラグを含む場合には、戻る前に .Fa mtx 引数を再取得しません。 ある状態を不可分にチェックできることを保証し、 その状態の変更も対応する wakeup も失うことなく 現在のプロセスを中断できることを保証するために、 この mutex は使用されます。 .Sh 戻り値 上記を参照してください。 .Sh 関連項目 .Xr ps 1 , .Xr malloc 9 , .Xr mi_switch 9 .Sh 歴史 sleep/wakeup プロセス同期機構はとても古いです。 これはとても早期のバージョンの .Ux で登場しました。 .Pp .Fn tsleep 関数は .Bx 4.4 で登場しました。 .Pp .Fn sleep 関数は伝統的な形式でした。 これはタイムアウトも .Fa wmesg も指定できないため、使用取り止めとなりました。 .Sh 作者 .An -nosplit このマニュアルページは .An J\(:org Wunsch Aq joerg@FreeBSD.org によって書かれました。