通过流程,我可以执行以下操作:
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);
以这种方式,我可以只通过 pid 来管理 windows 进程,这对于多平台代码来说很好。
我想将此模式扩展到工作对象:
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。
所以问题是:我的主进程在关闭它后有什么办法来处理这个工作吗?