gpt4 book ai didi

c++ - Windows API 作业对象 : Don't pass on to grandchildren

转载 作者:行者123 更新时间:2023-11-30 05:36:52 26 4
gpt4 key购买 nike

我有一个 Windows 命令行应用程序 child.exe,我想为其创建一个包装器 parent.exe。我通过使用 CreateProcess 从父级生成子级来实现这一点:

int wmain(int argc, WCHAR *argv[]) {
STARTUPINFO startupInfo = createStartupInfo();
PROCESS_INFORMATION processInfo = {0};
if(CreateProcessW(
L"C:\\child.exe", NULL, NULL, NULL, FALSE,
CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &processInfo
)) {
WaitForSingleObject(processInfo.hProcess, INFINITE);
CloseHandle(processInfo.hThread);
CloseHandle(processInfo.hProcess);
return 0;
} else {
return -1;
}
}

STARTUPINFO createStartupInfo() {
// Create and return a STARTUPINFO structure...
}

我现在希望子进程在父进程关闭时终止。正在关注another question ,我正在使用 Job Objects 这样做:

// Create and initialise the job object:
HANDLE ghJob = CreateJobObject(NULL, NULL);
if (ghJob == NULL) { /* Error handling... */ }
else {
JOBOBJECT_EXTENDED_LIMIT_INFORMATION jeli = { 0 };
// Configure all child processes associated with the
// job to terminate when the parent closes:
jeli.BasicLimitInformation.LimitFlags =
JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
if (! SetInformationJobObject(
ghJob, JobObjectExtendedLimitInformation, &jeli, sizeof(jeli)
)) { /* Error handling... */ }
}

然后我通过 AssignProcessToJobObject 将创建的子进程分配给这个作业:

if(CreateProcessW(...)) {
AssignProcessToJobObject(ghJob, processInfo.hProcess));
WaitForSingleObject(processInfo.hProcess, INFINITE);
...
} ...

这是有效的:因为新创建的进程被分配给一个带有 JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 的作业,所以当父进程出于某种原因关闭时,子进程会自动终止。

但这是我的问题:我无法控制 child.exe。它产生自己的子进程(比如 grandchild.exe),所以我们有:

parent.exe -> child.exe -> grandchild.exe

不幸的是,当我如上所述将作业对象分配给 child.exe 时,“grandchild.exe 的产生”失败了。我相信这是因为 grandchild.exe 继承了我的作业定义,但是 child.exe 试图将自己的作业定义应用于 grandchild.exe 但失败了因为在 Windows 7 上,一个作业可能只与一个作业相关联。 docs for AssignProcessToJobObject假设如果希望创建不从父进程继承作业的进程,则必须在调用 CreateProcess 时使用 CREATE_BREAKAWAY_FROM_JOB 标志。但问题是对 CreateProcess 的调用发生在 child.exe 中,我无法访问它。

谁能想到一个解决方案,允许 child.exe 自由地生成它自己的(大)子进程,同时让我可以终止 child.exe parent.exe 何时关闭?

最佳答案

您只需在作业上设置JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK 标志。此标志可防止子进程自动分配给作业。

使用 SetInformationJobObject函数和 JobObjectExtendedLimitInformation 选项。该标志在 MyExtendedLimitInformation.BasicLimitInformation.LimitFlags 成员中设置。

关于c++ - Windows API 作业对象 : Don't pass on to grandchildren,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33424492/

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