私は、外部クロックを使ってタイミング機能を実行するカーネルモジュールを作成しています。基本的に、このモジュールは、クロックからのパルスをカウントし、頻繁にカウントを繰り返します。ユーザープロセスはioctlを使用して、特定のカウントで起きるように要求することができます。次に、いくつかのタスクを実行し、次回同じカウントが来るまで同じioctlを呼び出します。このようにして、これらの外部タイミングを使用して定期的に実行することができます。wait_event_interruptibleを使って定期的なイベントを待つ
私はwait_queue_head_t
の配列を、利用可能なスケジュールスロットごとに1つずつ作成しました(つまり、上記のように各「カウント」)。ユーザプロセスがioctlを呼び出すとき、私は単にsleep_on()
にioctl引数を指定して、スケジュールスロットを指定して待機キューを指定します。カーネルモジュールがクロックパルスを受信してカウントをインクリメントすると、カーネルモジュールはそのカウントに対応する待ち行列を起動します。
私は、プロセスがスリープするかどうかを確認するためのテスト、およびsleep_on()
に対応するコールの間で変更する状態の可能性がありますので、それは、sleep_on()
を使用するconsidered bad practiceであることを知っています。しかし、この場合、私は覚醒する事象が周期的であるため、睡眠前にそのような検査を行わない。まもなく別のものが来るので、ちょうど覚醒しているイベントを "見逃す"かどうかは関係ありません(実際には、ioctlが指定されたスケジュールスロットに非常に近く呼び出された場合、何かがうまくいかず、次のスロットとにかく)。
私はwait_event_interruptible()
を使用して見ましたが、これはより安全だと考えられていますが、wait_event_interruptible
が必要とする条件引数には何を入れるべきかわかりません。 wait_event_interruptible
はスリープ状態に入る前にこの状態をチェックしますが、ioctlが呼び出されると常にスリープ状態にします。私は眠る前にクリアして目を覚ます前に設定するフラグを使うことができますが、待機キューに複数のプロセスがある場合にはうまくいかないかもしれないと心配しています。起きた。
私はこれについて心配していますか?または、wait_queue内のすべてのプロセスが起動する前にウェイクアップされることが保証されている(したがってフラグをクリアすることができますか?)このようなシステムを実装するより良い方法はありますか?実際にsleep_on()
を使用するだけでいいですか? (もしそうなら、割り込み可能なsleep_on()
のバージョンがありますか?)
ありがとうございました。私のカーネルはまだ 'interruptible_sleep_on()'を持っているので、今のところそれを使用します。私は、プロセスごとのフラグを実装し、それをioctlに渡すことは考えていませんでした。私が必要な場合には、wait_event_interruptible()を使う最良の方法のように聞こえます。 – llakais