前振り
Windowsにはsvchost.exeというプロセスがいっぱい起動しています。これ、DLLになっているサービスを起動する親プロセス…なのですが、タスクマネージャで見ただけではどのプロセスがどのサービスを起動しているのかさっぱりわかりません。参考:Windows 2000 の Svchost.exe の詳細
Windows XP Professional Edition の Svchost.exe の詳細
svchost.exeの他にもいわゆるアプリケーションサーバものはそうですね。単一のexeが親になって、呼ばれる側はdllとして提供すると。しかし、このような場合、どのpidでどのdllがロードされているのかわかりづらいです。sysinternals.comのlistdll.exeなどを使えばわかりますが。
本題
私が今作っているプログラムも同様で、一つのhoge.exeが同時に複数個起動する可能性があります。そうなると、タスクマネージャではどの処理を行っているのかわからない。そこで、svchost.exeのように、別コマンド経由で各hoge.exeの内部情報をダンプしよう…とおもいつきました。実装検討
- ファイルに書く
- スレッドを作って、待機。指定されたイベントがくればpipeなどで情報を送信する
- プロセス毎に規則に則って共有メモリを作り、共有メモリの情報を参照する。
ファイルに書くというのはゴミが残りそうだから脱落。スレッドもこの程度のために作るのはちょっと大げさ…ということで、共有メモリを選択してみました。
いざ始めてみると
….NET Frameworkには共有メモリのクラスない?VSUGでもちょうどC#で共有メモリを使いたい - 初心者なんでも相談室 - Visual Studio User Groupという質問が出ていたけれど。クラス作ろうとすると割と大変そうだし、仕方ないから別の要件で用意していた、ネイティブコードのDLLに共有メモリを扱うコードを追加。うーん、共有メモリって推奨されないのか…まぁ、なんとなくわからないでもないけれど。
こういう風にfoo.exeが書くだけ、bar.exeは参照するだけ。データは大きくても数KB、通信速度は重要視しない…という情報のやりとりする場合、もっともいいのはどんな方法なんだろう。