スリープ・カーネル・サービス

目的

呼び出し側カーネル・スレッドが、指定されたチャネルで待機するように強制します。

構文

#include <sys/types.h>
#include <sys/errno.h>
#include <sys/pri.h>
#include <sys/proc.h>
int sleep ( chan,  priflags)
void *chan;
int priflags;

パラメーター

項目 説明
Chan チャネル番号を指定します。 睡眠 サービスの場合、このパラメーターは、待機するチャネル (スリープ・オン) を識別します。
プリフラグ 2 つの条件を指定します。
  • カーネル・スレッドが再活動化されるときに実行される優先順位。
  • 睡眠 カーネル・サービスによるシグナルの処理方法を示すフラグ。

有効なフラグおよび優先順位の値は、 /usr/include/sys/pri.h ファイルに定義されています。

説明

睡眠 カーネル・サービスは互換性のためにのみ提供されており、新しいコードで呼び出すことはできません。 新しいコードを作成するときは、 スリープ・スレッド または 待機の設定 カーネル・サービスを使用する必要があります。

睡眠 サービスは、呼び出し側カーネル・スレッドをスリープさせ、 チャン パラメーターによって指定されたチャネルに対してウェイクアップが発行されるのを待機させます。 プロセスが再びウェイクアップされると、 プリフラグ パラメーターで指定された優先順位で実行されます。 新しい優先順位は、プロセスがユーザー・モードに戻るまで有効です。

チャネル上で待機しているすべてのプロセスが同時に再始動され、活動化されたスレッド間で競合状態が発生します。 したがって、 睡眠 サービスから戻った後、各スレッドは、再度スリープする必要があるかどうかを検査する必要があります。

チャン パラメーターによって指定されるチャネルは、単に、規則により待機するイベントを識別するアドレスです。 カーネル・エクステンションまたはカーネル・エクステンションがそのようなイベントを検出すると、 チャン パラメーターに対応する値を指定して ウェイクアップ サービスが呼び出され、そのチャネルで待機しているすべてのスレッドが開始されます。 チャネル ID はシステム全体で固有でなければなりません。 通常、この値には、外部カーネル変数 (デバイス・ドライバーで定義可能) のアドレスが使用されます。

プリフラグ パラメーターに SWAKEONSIG (S) フラグが設定されていない場合、シグナルによってスリープが終了することはありません。 SWAKEONSIG (S) フラグが設定されていて、 バッチ フラグが設定されていない場合、シグナルによってスリープが中断されると、カーネルは LongJMPX カーネル・サービスを呼び出して、最後の SetJMPX 呼び出しによって保管されたコンテキストを再開します。 したがって、 バッチ フラグを設定せずに割り込み可能スリープを行うシステム・コール (デバイス・ドライバー DDOPENDDREAD、および ddwrite ルーチンの呼び出しなど) またはカーネル・プロセスは、 SetJMPX カーネル・サービスを使用してコンテキストをセットアップする必要があります。 これにより、スリープ中のプロセスにシグナルが送信された場合にスリープを再開できます。

注意: 睡眠 サービスの呼び出し側は、 カーネル・ロック パラメーターで指定されたカーネル・モード・ロックを所有している必要があります。 カーネル・ロックが 睡眠 サービスの呼び出し側によって所有されていない場合、 睡眠 サービスは、互換性のあるレベルの逐次化を提供しません。

実行環境

睡眠 カーネル・サービスは、 プロセス環境 からのみ呼び出すことができます。

戻り値

項目 説明
0 正常終了したことを示します。
1 プリフラグ パラメーターに バッチ フラグと SWAKEONSIG (S) フラグの両方を設定して、シグナルがスリープを中断したことを示します。