gpt4 book ai didi

c - 是否可以仅按名称管理 JobObject,而无需保持打开的 HANDLE?

转载 作者:可可西里 更新时间:2023-11-01 11:20:23 28 4
gpt4 key购买 nike

使用流程,我可以执行以下操作:

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 says “当作业的最后一个句柄已关闭并且所有关联的进程都已退出时,该作业将被销毁”。这样的话,我的主进程已经关闭了他的最后一个句柄,但是子进程还在运行,还有一个句柄。调用 IsProcessInJob(proc, NULL, &isit) 确认作业仍然存在。但是,我打开作业的调用返回 NULL,错误代码为 ERROR_FILE_NOT_FOUND。

那么问题是:我的主进程在关闭后是否有任何方法来处理该作业?

最佳答案

这就是 NT 对象管理器的工作原理。几乎所有对象都是“临时的”,这意味着当不再存在对它们的引用(内核模式指针引用或句柄)时,它们将被删除。您应该能够通过在作业对象上调用 NtMakePermanentObject 来更改此行为。不过,我以前从未尝试过。

关于c - 是否可以仅按名称管理 JobObject,而无需保持打开的 HANDLE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13942451/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com