2011-12-27 2 views
2

複数のプロセス(スレッドではありません)がデバイス記述子(例:/ dev/xyx)をブロッキングモードでポーリングでき、ドライバがPOLLINを返すと、複数のアプリケーションがディスクリプタのポーリングを実行しています

詳細:私はドライバを持っており、ドライバからユーザー空間のアプリケーションへの非同期イベント通知をサポートするため、ドライバにポーリング機能を実装しました。私は複数のプロセスが自分の記述子/ dev/xyzに対して投票を行うことを期待しています。ポーリングを実行すると、すぐにドライバが.Poll関数から待機キューに入れられ、ドライバがPOLLINを返すまでブロックします。

ドライバがPOLLINを実行するときに、1つのプロセスがディスクリプタでブロックされたときに正常に動作するため、poll()はブロックを解除して処理します。しかし、/ dev/xyzに複数のプロセスがブロックされていて(ポーリングを行うことによって)、ドライバがPOLLINを送信した場合、プロセスの1つだけがブロック解除され、残りのブロックはブロックされます。

ドライバが/ dev/xyz上でPOLLINを実行したときに、そのディスクリプタでブロックされたすべてのプロセスが起動することを確認する方法はありますか? (待っている待ち行列のリストか何かを歩いているような)??

答えて

0

wake_up(またはwake_up_interruptible)をwake_up_all(wake_up_interruptible_all)に置き換えることができます。これは待っているすべてのプロセスを目覚めさせるべきです。

+0

こんにちは、ありがとうございます。私はwake_up_interruptible_all()を試しましたが、まだブロックされている2つのプロセスのうちの1つだけがブロックされていないことがわかります。私の2番目のプロセスは、イベントについては無知であり、poll sysコールでブロックされたままです。私は自分のプロセスで投票(fd、1、-1)をしています。ドライバから両方のプロセスが待機キューに置かれていることを確認しました(printksを使用)。それ以上の提案は大歓迎です。ありがとう – Arav

+0

私はちょうど "多分"いくつかを投げることができます。たぶん、2つのプロセスが同じ待ち行列にない可能性があります。おそらく起きた後、Linuxは再びポーリングハンドラを呼び出し、再びスリープ状態に入りました。おそらく、待機キューを入れてデータがあるかどうかをチェックするという競合条件があるかもしれません(しかし、これは一貫した動作を説明します)。 – ugoren

関連する問題