tl; dr:タイムアウトが指定されている場合でも、読み取りファイル記述子(procfsカーネルモジュールを指す)に対するselect呼び出しが無期限にブロックされる可能性がありますか?
私は、サービスへのアクセスを管理するいくつかのカーネルモジュールがある組み込みLinuxシステムで作業しています。そのようなモジュールの1つは、VLANの状態の変化を監視します。インターフェイスを。の下のディレクトリにエクスポートします/proc
。プロセスは、そこで作成されたproc_fileから読み取ろうとすることにより、このモジュールに通知をバインドできます。変更があると、モジュールはそのインターフェースでデータを提供し、呼び出し元の読み取りはその情報とともに返されます。
カーネルモジュールがカーネルセマフォ(struct semaphore)で呼び出し元の読み取りをブロックするため、これが問題を引き起こしているように見えます。これにより、発信者は「D」または中断できないブロック状態になります。プロセスを適切に強制終了することはできず、終了すると機能しなくなります。それは機能していないだけでなく、そのリソースを解放していません。
これは「そうしないでください」の場合だと思いますが、私はカーネルモジュールの専門家ではありません。モジュール内でspinlockまたはwait_event_interruptableを使用するのがより良いアプローチのようです。これらのレガシーカーネルモジュールを変更することは大変なことなので、読み取りを行う前にselectでFDをチェックすることで回避しようとしました。ただし、それも無期限にブロックされているように見えます。
カーネルモジュールで使用されているミューテックスを変更せずにこれを修正する方法はありますか?