プロセスを使用すると、次のことができます。
int pid;
::CreateProcess(NULL, cmd, ..., &pi);
pid = pi.dwProcessId;
::CloseHandle(pi.hProcess);
// then later...
HANDLE proc = ::OpenProcess(PROCESS_TERMINATE, FALSE, pid);
::TerminateProcess(proc, 1);
::CloseHandle(proc);
このように、Windows プロセスを pid のみで管理できます。これは、マルチプラットフォーム コードに適しています。
このパターンをジョブ オブジェクトに拡張したいと思います。
HANDLE job = ::CreateJobObject(NULL, name);
::AssignProcessToJobObject(job, proc); // proc from above
::CloseHandle(job);
// then later...
job = ::OpenJobObject(JOB_OBJECT_TERMINATE, FALSE, name);
::TerminateJobObject(job, 1);
明確にするために、私は仕事をしていませんが、私の子プロセスは仕事をしています。MSDN は、「最後のハンドルが閉じられ、関連するすべてのプロセスが終了すると、ジョブは破棄されます」と述べています。この場合、私のメイン プロセスは最後のハンドルを閉じましたが、子プロセスはまだ実行中であり、まだハンドルを持っています。IsProcessInJob(proc, NULL, &isit)
ジョブがまだ存在することを確認する呼び出し。ただし、ジョブを開く呼び出しは NULL を返し、エラー コードは ERROR_FILE_NOT_FOUND です。
質問: 私のメイン プロセスには、ジョブを閉じた後にジョブを処理する方法はありますか?