ddselect デバイス・ドライバー・エントリー・ポイント

目的

デバイスで 1 つ以上のイベントが発生したかどうかを確認します。

構文

#include <sys/device.h>
#include <sys/poll.h>
int ddselect ( devno,  events,  reventp,  chan)
dev_t devno;
ushort events;
ushort *reventp;
int chan;

パラメーター

項目 説明
devno メジャー・デバイス番号とマイナー・デバイス番号を指定します。
イベント 検査するイベントを指定します。
レベントプ 返されたイベント・ポインター。 参照によって渡されるこのパラメーターは、選択されたどのイベントが呼び出し時に true であるかを示すために、 ddselect ルーチンによって使用されます。 レベントプ パラメーターが指す戻りイベントの場所は、このルーチンに入る前に 0 に設定されます。
Chan チャネル番号を指定します。

説明

ddselect エントリー・ポイントは、 選択 または 投票 サブルーチンが使用されるとき、または Fp_SELECT カーネル・サービスが呼び出されるときに呼び出されます。 これは、指定された 1 つ以上のイベントがデバイスで発生したかどうかを判別します。

ddselect ルーチンを提供できるのは、文字クラスのデバイス・ドライバーだけです。 ロー読み取り/書き込みアクセスを提供する場合でも、ブロック・デバイス・ドライバーによって提供することはできません。

イベントに関する情報の要求

イベント パラメーターは、フラグ (ビット) として検査する可能性のあるイベントを表します。 選択操作またはポーリング操作をサポートするデバイスに適用される場合、 選択 サブルーチンおよび 投票 サブルーチンに対して定義される 3 つの基本イベントがあります。

イベント 説明
POLLIN 入力がデバイス上に存在します。
POLLOUT 装置は出力に対応しています。
POLLPRI 装置で例外条件が発生しました。

4 番目のイベント・フラグは、 自己通知 カーネル・サービスを使用して後でイベントを通知するために、 ddselect ルーチンがこの要求を記録する必要があるかどうかを示すために使用されます。 要求されたイベントの非同期通知をデバイス・ドライバーが必要としない場合は、 イベント パラメーターでこのフラグを設定できます。

イベント 説明
POLLSYNC (同期) この要求は同期要求のみです。 このルーチンは、後でイベントが発生した場合でも、この要求に対して 自己通知 カーネル・サービスを呼び出す必要はありません。

イベント パラメーター内の追加のイベント・フラグは、 投票 サブルーチン呼び出しでのデバイス固有のイベントのために残されます。

選択処理

イベント パラメーターで指定された 1 つ以上のイベントが真である場合、 ddselect ルーチンは、 レベントプ パラメーターに対応するビットを設定することによって、これを示す必要があります。 レベントプ 戻りイベント・パラメーターは参照によって渡されることに注意してください。

要求されたどのイベントも true ではない場合、 ddselect ルーチンは戻りイベント・パラメーターを 0 に設定します。 これは、 レベントプ パラメーターを介して参照によって渡されます。 また、 イベント パラメーターの POLLSYNC (同期) フラグも検査します。 このフラグが true の場合、イベント要求は同期要求のみであったため、 ddselect ルーチンは単に戻る必要があります。

ただし、 POLLSYNC (同期) フラグが false の場合、 ddselect ルーチンは、指定された 1 つ以上のイベントが後で発生したときにカーネルに通知する必要があります。 この目的のために、ルーチンは、 イベント パラメーターで要求されたイベントごとに別々の内部フラグを設定する必要があります。

これらのイベントのいずれかが該当する場合、デバイス・ドライバー・ルーチンは 自己通知 サービスを使用してカーネルに通知する必要があります。 その後、対応する内部フラグをリセットして、イベントが再通知されないようにする必要があります。

場合によっては、デバイスが、サポートされているイベント (例えば、通信回線が作動可能でない場合など) が満たされない状態になることがあります。 この場合、 ddselect ルーチンは、対応する レベントプ フラグを単に 1 に設定する必要があります。 これにより、 選択 または 投票 サブルーチンが無期限に待機することを防ぎます。 ただし、この場合、呼び出し元は、満たされたイベントと満たされていないイベントを区別できません。 NDELAY (遅延) オプションを指定した後の要求が失敗した場合にのみ、エラーが検出されます。

注: 他のデバイス・ドライバー・ルーチン ( DDREADddwrite ルーチンなど) は、選択操作またはポーリング操作をサポートするロジックを必要とする場合があります。

実行環境

ddselect ルーチンは、プロセス環境でのみ実行されます。 これは、ドライバーで定義された専用ロック・ワードとともにロッキング・カーネル・サービスを使用して、必要なデータ構造のシリアライゼーションを提供する必要があります。

戻り値

要求された選択またはポーリング操作が、指定されたリソースに対して有効である場合、 ddselect ルーチンは戻りコード 0 で戻ります。 ただし、以下のいずれかが該当する場合は、要求された操作は無効です。

  • デバイス・ドライバーは、要求されたイベントをサポートしません。
  • デバイスは、ポーリング操作と選択操作が受け入れられない状態にあります。

このような場合、 ddselect ルーチンは、関連する レベントプ フラグを 1 に設定せずに、ゼロ以外の戻りコード (通常は エインヴァル) で戻る必要があります。 これにより、 投票 サブルーチンは、このリソースに関連付けられた戻りイベント・パラメーターに POLLERR (R) フラグを設定して、呼び出し元に戻ります。 選択 サブルーチンは、要求されたすべてのイベントがこのリソースについて真であることを呼び出し元に示します。

該当する場合は、 select サブルーチンの POSIX 1003.1 標準で定義されている戻り値を使用する必要があります。