5

プログラムの内部状態を反映するために、procfs でファイル マッピングを作成できますか?

例えば、

main.c:

char *message;

...

pid が 1200 であると仮定すると、メッセージ変数を反映する一時ファイル /proc/1200/variables/message を作成できますか?

/proc/.../{net, fd, task, etc.} があるので、proc fs で作業する必要があると思います。proc fs に別の変数/セクションを追加したい場合、どこから始めればよいですか?

4

4 に答える 4

4

やりたいことを実現するためのツールはありません。

近いものもいくつかあります--gdb(1)実行中のプログラムをイントロスペクトし、いくつかの変数の値を表示する方法を知っています (すべての変数がコンパイルに耐えられるわけではありません -- ただし、デバッグ-gフラグgdb(1)は最適化がプログラムにどのような影響を与えたかを発見するのに役立ちます)。

FUSEプロジェクトは、ユーザー空間プログラムがカーネルを介して他のプロセスにファイルシステムを提供できるようにします。FUSE を直接使用して選択した変数をプログラムからエクスポートするか、より野心的なものを試してツールを作成しgdb(1)、FUSE の公開機能で内省機能をカプセル化し、このサービスを世界中に提供することができます。

プログラム内からの使用を検討することもでき9pます。これは FUSE と精神的に似ており、プログラムがファイルシステム インターフェイスを介して機能へのインターフェイスを提供できるようにします。(wmiiウィンドウ マネージャーで使用されていることがわかります。ファイル システム インターフェイスを介して驚くほど多くのウィンドウ マネージャーを制御でき、好きな言語を使用して簡単にプログラミングできます。) 繰り返しますが、これをgdb(1)のイントロスペクションと統合できます。これを提供しようとする能力。

そのようなプロジェクトは、すぐに達成できるものではなく、上級プロジェクトや大学院のプロジェクトに値すると思います。

于 2011-11-19T09:02:46.337 に答える
3

Instead of using /proc, you can use a named pipe.

Create a fifo using mkfifo, and have your program open it for write. Either in a dedicated thread or asynchronously your program will generate text when someone run cat your-pipe in the shell. cat opens the named pipe for reading, of course.

This essentially mimics the cat /proc/.... interface, but instead of having a kernel module implement the text generation, you have a program implementing it.

于 2011-11-19T10:54:17.110 に答える
3

一般的に言えば、ユーザー空間からだけではできません。procfs は、プロセスの状態を報告するカーネルです。したがって、このようなことをしたい場合は、

a)コンテンツを通信できるカーネルモジュールを作成する必要があります b)何らかの信号を介してそのコンテンツの取得をトリガーします。

だから、あなたが本当にこれをしたいのなら。次のパスをお勧めします。

1) プログラムの状態を通信できるカーネル モジュールを作成します。説明のために、これを kpsmod と呼びましょう。

2)ユーザー空間と通信させ、何らかのメカニズム(ネットリンクなど)を介してユーザープロセスと通信させ、変数アドレスを登録する登録プロセスを開始します。ユーザー空間プログラムは、シグナル(SIGHUPまたはSIGUSR1など)で自分自身を「エクスポート」することに関心があることをモジュールに伝えます。これもプログラム可能にします。読み取る名前、アドレス、およびサイズを渡します (必要に応じて型情報と共に)。変数がスタックにある場合は、拒否する必要があります。これには、グローバルにアクセス可能なシンボルのみを許可する必要があります (簡単にするため)。

3) 特定の変数の proc_read 時にプロセスの ptrace スタックにアクセスすることも考えられます。

4) 次に、カーネルモジュールは、変数が読み取られるときに、すべての変数に対して /proc/kpsmod//vars* を作成する必要があります

5) proc を介してメモリの内容を読み取りダンプします (フォーマットされている可能性があります)。

そして出来上がり:-)あなたはあなたの望む効果を持っています。

于 2011-11-19T09:05:14.103 に答える
1

カーネルモジュールを書いていない限り、できません

于 2011-11-19T08:58:56.800 に答える