2004年06月10日
プロセスの親子関係を知る
Windowsのプロセスにも一応親子関係が存在する。例えばタスクマネージャのプロセスタブで右クリックして「プロセスツリーの終了」を選択すると、子プロセスもろとも殺すことができる。プロセスツリーを見るにはProcess Explorerというツールが便利だろう。
あるプロセスAが新規プロセスBを作成すると、必ずAはBの子供になるようだ。そんなこともあり、通常、ほとんどのアプリケーションはexplorer.exeの子プロセスのようだ。また、何らかのランチャからプロセスを立ち上げていると、ランチャーから起動したプロセスはランチャーの子プロセスとなっている。他にも、サービスのプロセスは「services.exe」の子プロセスのようだ。ちなみに、services.exeはwinlogon.exeの子プロセスだ。
System Idle Process
+System
+smss.exe
+csrss.exe
+winlogon.exe
+winlogon.exe
+services.exe
+svchost.exe
+ :
Explorer.exe
+IEXPLORE.exe
+ :
+(ランチャー)
+(ランチャーから立ち上げたアプリ)
プロセスAの子プロセスがBで、その子プロセスがCのとき
TopLevelProcess.exe
+A
+B
+C
Bを殺すと、CはAの子供にはならずに自動的にトップレベルのプロセスになるようだ。
TopLevelProcess.exe +A C
自作のアプリケーションで親子関係を知りたい場合は、CreateToolhelp32Snapshot関数を呼び出して、Process32First・Process32Nextなどを呼び出しながらPROCESSENTRY32構造体の「th32ParentProcessID」を参照するとよいようだ。なお、NT4.0ではToolHelp functionsが提供されていないため、この方法は使えないようだ(未確認)。