Windows プロセスの親子関係を見る
Windows プロセスの親子関係について調べます。
動作確認環境
- Windows 11 Home 21H2
プロセスツリーを見る
Windows では、あるプロセスから別のプロセスを生成すると、親子の関係になります。親子関係は Sysinternals のプロセスエクスプローラー (ProcExp.exe) で確認できます。
Windows のシェルである「エクスプローラー (explorer.exe)」から「Excel (excel.exe)」と「コマンドプロンプト (cmd.exe)」を起動し、コマンドプロンプトから「ワード (winword.exe)」を起動し、ワードから[ファイルを開く]ダイアログボックスを利用して「メモ帳 (notepad.exe)」を起動した場合の親子関係を見てみましょう。
想定通りのプロセスツリーが構成されています。
※ conhost.exe は cmd.exe が自動的に生成するプロセスです。その他、本調査に関係のないプロセスの情報は消しています。以下同様。
親プロセス以下一式の終了が可能
taskkill コマンドの「/T」オプションを使うと、親プロセス以下一式を終了させることができます。
C:\> taskkill /?
TASKKILL [/S システム [/U ユーザー名 [/P [パスワード]]]]
{ [/FI フィルター] [/PID プロセスID | /IM イメージ名] } [/T] [/F]
......
/T 指定したプロセスとそのプロセスが開始
したすべての子プロセスを削除します。
......
タスクマネージャーから[プロセスツリーの終了]コマンドを選択しても同じことができます。
それでは、taskkill コマンドでコマンドプロンプト以下一式を強制終了してみます。
C:\> taskkill /f /im cmd.exe /t
コマンドプロンプト、および、子供のワードと孫のメモ帳が終了しました。
シェルであるエクスプローラー以下一式を強制終了するとどうなるでしょうか。
エクスプローラーも Excel も終了し、真っ白なデスクトップになりました。
この画面から復旧させるには、たとえば [Ctrl]+[Shift]+[Esc] キーを押してタスクマネージャーを起動し、[ファイル]-[新しいタスクの実行]から「explorer.exe」を実行してください。
親プロセスを失うと新しいツリーが作られる
再度、冒頭のツリー状態を構築します。
さきほどは「コマンドプロンプト以下一式」を強制終了しましたが、今度は「コマンドプロンプトのみ」を強制終了してみます。
C:\> taskkill /f /im cmd.exe
「エクスプローラー」→「コマンドプロンプト」→「ワード」→「メモ帳」の連鎖が切れ、「エクスプローラー」と対等な、「ワード」→「メモ帳」という新しいプロセスツリーが誕生しました。
ワードのプロパティを見ると親プロセスが「cmd.exe(14796)」であったことは記憶されていますが、親の親をたどることができず独立することになったイメージです。
続いてエクスプローラー以下一式を強制終了してみます。前回は画面が真っ白になりましたが、どうなるでしょうか。
ワードとメモ帳がエクスプローラーから独立しているので、巻き込まれることなく、真っ白なデスクトップにこの 2 つのアプリケーションが開いているという不思議な状態になりました。
Edge を終了しても生き返る理由
Windows にログオンし Microsoft Edge を起動したときのプロセスツリーを示します。エクスプローラーの子孫として複数の「msedge.exe」プロセスが生成されています。
この状態で Edge を終了すると、エクスプローラーの配下からは「msedge.exe」が消えるものの、新たにエクスプローラーと対等の「msedge.exe」ツリーが生成されます。どういうことでしょうか。OS と Edge が密に結合していて何か特別な処理をしているのでしょうか。
いえ、Edge には「スタートアップブースト」という設定があり、デフォルトで ON になっています。
この機能を有効にしていると、Edge は終了直前にスタートアップブースト用の「msedge.exe」を子プロセスとして起動し、その後自分自身を終了します。すると、親を失ったスタートアップブースト用「msedge.exe」は独立し、エクスプローラーと対等な位置にプロセスツリーを形成します。
これが Edge を終了しても生き返る(ように見える)理由であり、OS が Edge を特別扱いしているわけではありませんでした。
「スタートアップブースト」の設定を OFF にすると、Edge の終了とともに「msedge.exe」プロセスも終了します。