16

新しいプロセスをフォークする C++ タスクがあります。そのプロセスには、いくつかの子プロセスがある場合があります。割り当てられた時間を過ぎてタスクが実行された場合は、フォークされたプロセスを強制終了します。

ただし、生成されたプロセスを孤立させたくありません。私たちは彼ら全員が死ぬことを望んでいます。私はプロセス エクスプローラーを使用しましたが、Windows タスク マネージャーの「プロセス ツリーの終了」に似た「プロセス ツリーの強制終了」オプションがあるため、これを行うためのパブリック API があると推測/想定しています。誰かがこれを行ったことがありますか、またはそうするパブリック API への参照を知っていますか?

4

5 に答える 5

20

「Jobs API」を検討することをお勧めします。CreateJobObjectと友達。適切な属性を設定することで、子プロセスを強制的にジョブ内に留めることができます。その後、TerminateJobObjectいつでも電話をかけることができます。

明確化: これは、タスク マネージャーが行うことではありません。

于 2009-03-02T23:39:29.717 に答える
6

上に示したように、ジョブオブジェクトルートを使用することをお勧めします。これが最も信頼性が高くなります。

ジョブオブジェクトルートに移動できない場合は、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));
于 2009-03-03T00:01:37.123 に答える
0

WMI を使用して、タスクを実行するクラスを作成できるルート計画を作成することもできます。
この「WMI ドキュメントはどこにありますか?」を参照してください。
およびWMI COM ライブラリ
WMI C++ アプリケーションの例

于 2009-03-03T00:15:06.637 に答える