2

現在、カーネル イベントに基づいてデータを生成し、それらをファイルにプッシュするカーネル モジュールを作成しようとしています。これは悪いことだと読んだ後 (私も同意見です)、必要に応じてユーザー プログラムがプルできる /proc ファイルにデータを保持する方が理にかなっていると判断しました。しかし、この考えはあらゆる種類の問題、特にこのファイルをいつ、どのようにクリアするかという問題を引き起こしました。だから私は考えました...「 /proc に名前付きパイプを作成して、そこから読み取らないのはなぜですか?」

proc ファイルの読み取り関数と書き込み関数を設定する一般的な要点はわかりましたが、これをどのように行うかについてはまだ概念的な問題があります。つまり、任意のデータを取得してカーネルからそのようなパイプに書き込む関数をどのように作成すればよいでしょうか? カーネル空間から名前付きパイプにデータをプッシュする方法を知っている人はいますか? 最終的に、/proc ファイルである必要はありません(特に、そうするのが間違っている場合) が、それが私が到達した結論でした。次に、ユーザー空間プログラムからそれにアタッチする方法を理解する必要がありますが、それは別の問題だと思います。

4

5 に答える 5

5

名前付きパイプを作成する代わりに、やりたいことは「キャラクター デバイス」を作成することです。カーネルからユーザー空間への単純な対話またはストリーミング データが必要な場合は、これが通常の方法です。Linux カーネルで同様のデバイスを検索し、その動作を確認することをお勧めします。

于 2008-11-24T03:33:31.637 に答える
3

これが一般的に行われる方法は、ネットリンクソケットを使用することだと思います。1 つまたは複数のユーザー空間プロセスを「netlink」アドレスにバインドでき、カーネル機能は必要に応じてそれらのいずれかまたはすべてにメッセージをブロードキャストできます。

これは確かにいくつかのもの、特にネットワークサブシステムが行うことです。ユーザー空間プログラムは、この方法を使用して、ネットワーク インターフェイスの変更 (新しい IP アドレス、リンク ステータスの変更など) を監視することができます。

于 2008-11-24T21:32:46.170 に答える
1

私も Paul の意見に賛成です。キャラクター デバイスを実装するのがおそらく最善の方法です。/dev/kmem または /dev/rtc[0-9] を実装するコードを見ているかもしれません。また、シリアル ドライバーは、キャラクター デバイスを使用してドライバーを実装します。

仮想デバイスと考えてください。:-)

于 2008-11-24T04:22:46.810 に答える
1

/procは実際には実際のファイル システムではありません。現在実行中のものに基づいてカーネルによって構築されます。名前付きパイプを作成できるとは思いません。

于 2008-11-24T04:32:20.457 に答える