SLEEP(9)

名称
sleep, msleep, tsleep, wakeup - イベントのウェイト

書式
<sys/param.h> <sys/systm.h> <sys/proc.h> int tsleep(void *ident, int priority, const char *wmesg, int timo) int msleep(void *ident, struct mtx *mtx, int priority, const char *wmesg, int timo) void wakeup(void *ident) void wakeup_one(void *ident)

解説
関数 tsleep() および wakeup() はイベントに基づいたプロセスのブロックを取り扱います。 プロセスが外部イベントを待たなければならない場合には、そのプロセスは tsleep() によってスリープ状態に置かれます。 パラメータ ident は、プロセスがどのイベント上でスリープしているかを識別する一意的な 任意のアドレスです。 単一の ident 上でスリープしている全てのプロセスは後で、 wakeup() によって起こされます。 これは、しばしば割り込みルーチンの中から呼び出され、 プロセスがブロックしているリソースが現在利用可能になったことを示します。

パラメータ wmesg は ps(1) のようなツールのためのスリープ状態を解説する文字列です。 これらのプログラムの任意の文字列を表示するための領域の制限のため、 このメッセージは 6 文字を超えるべきではありません。

wakeup_one() 関数はパラメータ ident 上でスリープしているキューの中の最初のプロセスを実行可能に するために使用されます。 これは、多数のプロセスが同じアドレス上でスリープしているが、 実行可能となったときその中の 1 つのみが実際には役に立つ作業ができるときに、 システムが飽和することを防ぐことが可能です。

tsleep() 関数は一般的なスリープの呼び出しです。 明示された識別子上の wakeup が実行されるまでの間、 現在のプロセスを一時停止させます。 それからそのプロセスは明示された優先度 priority で実行可能にされます。 長くて timo / hz 秒間 (0 はタイムアウトなしを意味します) スリープします。 Giant ロックが保持されていないなら、 timo は 0 以外でなければなりません。 priority が PCATCH フラグを含む場合には、スリープの前後でシグナルがチェックされます。 そうでない場合には、シグナルはチェックされません。 起こされた場合には 0 を返し、タイムアウトが経過した場合には EWOULDBLOCK を返します。 PCATCH が設定されていてシグナルが配信される必要がある場合で、 可能であれば現在のシステムコールが再開始されるべきである場合には ERESTART が返され、 (EINTR を返す) シグナルによってそのシステムコールが中断されるべき場合には EINTR が返されます。

msleep() 関数は tsleep の変種です。 パラメータ mtx は、スリープの前に抜け、 msleep() が戻る前に入る mutex です。 priority が PDROP フラグを含む場合には、戻る前に mtx 引数を再取得しません。 ある状態を不可分にチェックできることを保証し、 その状態の変更も対応する wakeup も失うことなく 現在のプロセスを中断できることを保証するために、 この mutex は使用されます。

戻り値
上記を参照してください。

関連項目
ps(1), malloc(9), mi_switch(9)

歴史
sleep/wakeup プロセス同期機構はとても古いです。 これはとても早期のバージョンの UNIX で登場しました。

tsleep() 関数は 4.4BSD で登場しました。

sleep() 関数は伝統的な形式でした。 これはタイムアウトも wmesg も指定できないため、使用取り止めとなりました。

作者
-nosplit このマニュアルページは Jörg Wunsch <joerg@FreeBSD.org> によって書かれました。