“殺害プロセスツリー”と同等の実行Windows上のC ++

StackOverflow https://stackoverflow.com/questions/604522

  •  03-07-2019
  •  | 
  •  

質問

新しいプロセスを分岐する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 ++アプリケーションの例

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top