Linux 用のキャラクター デバイス ドライバーを実装しようとしていますが、問題が発生しています。つまり、デバイスに書き込まれたデータは、読み取りのためにバッファリングされます。利用可能なデータがない場合、「wait_event_interruptible」を介してブロックを読み取る呼び出し。書き込みハンドラが受信したデータは、「wake_up_interruptible」を呼び出します。リリース ハンドラーは、「wake_up_interruptible」も呼び出してリーダーのブロックを解除しますが、ドライバーが解放中であることを示すフラグを設定します。
ユーザー空間から、「open」を介してドライバーを開き、別のスレッドを開始する実行可能ファイルがあります。メイン スレッドは、「読み取り」の呼び出しに進みます。意図したとおり、読み取りに使用できるデータはなく、呼び出しはブロックされます。もう一方のスレッドは 1 秒間スリープし (メイン スレッドが読み取りとブロックを行うのに十分な時間を提供します)、「close」を呼び出してから、再度「close」を呼び出します。最初の呼び出しは「0」を返し、2 番目の呼び出しは「-1」を返します (予想どおり)。ただし、ドライバーのリリース ハンドラーが呼び出されることはなく、明示的にシグナルを送信したりデバイスにデータを書き込んだりしない限り、読み取りスレッドのブロックを解除する方法がわかりません。私の理解では、ドライバーへの最後のハンドルが閉じると、そのリリース ハンドラーが呼び出されます。
ユーザー空間のファイルレベルでの読み取り/クローズを正しく理解していますか? デバイスドライバーについて正しく理解していますか? 他に何か不足していますか?「Linux Device Drivers 3rd Edition」を調べたところ、この質問に対する答えが見つかりませんでした。Googleも検索しましたが、答えが見つからないようです。あなたが提供できるどんな助けも大歓迎です。私のカーネルのバージョンは 3.0.15 です。