“殺害プロセスツリー”と同等の実行Windows上のC ++
質問
新しいプロセスを分岐するC ++タスクがあります。そのプロセスには、いくつかの子プロセスがあります。タスクが割り当てられた時間を過ぎて実行される場合、分岐したプロセスを強制終了します。
ただし、生成されたプロセスを孤立させたくありません。私たちは彼ら全員が死ぬことを望みます。 Process Explorerを使用しましたが、「キルプロセスツリー」があります。オプションは、Windowsタスクマネージャーの「プロセスツリーの終了」に似ているため、これを行うためのパブリックAPIがあると思います。誰かがこれをやったことがありますか、それともパブリックAPIへの参照を知っていますか?
解決
「Jobs API」を検討することをお勧めします。 CreateJobObject
と友達。適切な属性を設定することで、子プロセスを強制してジョブ内にとどめることができます。その後、いつでも TerminateJobObject
を呼び出すことができます。
明確化:これはタスクマネージャーが行うことではありません。
他のヒント
上で示したように、ジョブオブジェクトルートに行くことをお勧めします。これは最も信頼性の高いものになります。
ジョブオブジェクトルートに移動できない場合は、toolhelp APIを使用して親プロセスIDを取得し、そのようにツリーを構築できます。ただし、Windowsには強い親子関係がなく、PIDがリサイクルされる可能性があるため、注意が必要です。 GetProcessTimes
を使用して、プロセスの作成時間を照会し、プロセスが子よりも古いことを確認できます。ツリーの中間プロセスが終了すると、ツリーをそれ以上歩くことができなくなります。
// Error handling removed for brevity
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 process;
ZeroMemory(&process, sizeof(process));
process.dwSize = sizeof(process);
Process32First(snapshot, &process);
do
{
// process.th32ProcessId is the PID.
// process.th32ParentProcessID is the parent PID.
} while (Process32Next(snapshot, &process));
TerminateProcess()<というWin32関数があります。それはあなたのために仕事をするはずです。
別の方法として、taskkillコマンドがこのようなことに役立つことがわかりました。
コマンドラインから:
taskkill /F /T /IM program.exe
コードから:
system("taskkill /F /T /IM program.exe");
その他のスイッチ(taskkill /?から直接):
TASKKILL [/S system [/U username [/P [password]]]] { [/FI filter] [/PID processid | /IM imagename] } [/F] [/T] Description: This command line tool can be used to end one or more processes. Processes can be killed by the process id or image name. Parameter List: /S system Specifies the remote system to connect to. /U [domain\]user Specifies the user context under which the command should execute. /P [password] Specifies the password for the given user context. Prompts for input if omitted. /F Specifies to forcefully terminate process(es). /FI filter Displays a set of tasks that match a given criteria specified by the filter. /PID process id Specifies the PID of the process that has to be terminated. /IM image name Specifies the image name of the process that has to be terminated. Wildcard '*' can be used to specify all image names. /T Tree kill: terminates the specified process and any child processes which were started by it. /? Displays this help/usage.
-John
強制終了するプロセスのプロセスIDを見つけて、「ツリーを歩く」ことが必要です。その子(およびその子など)のpidをメモし、すべてのプロセスを迅速かつ適切に終了します。
WMI、ルートプランニングを使用して、タスクを実行するクラスを作成することもできます。
この&quot; WMIのドキュメントはどこにありますか?&quot;
および WMI COMライブラリ
および WMI C ++アプリケーションの例