微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Windows API作业对象:不要传递给孙子们

我有一个Windows命令行应用程序child.exe ,我希望为其创build一个包装器parent.exe 。 我通过使用CreateProcess从父项产生子项来完成此操作:

int wmain(int argc,WCHAR *argv[]) { STARTUPINFO startupInfo = createStartupInfo(); PROCESS_@R_989_4045@ION processInfo = {0}; if(CreateProcessW( L"C:\child.exe",NULL,FALSE,CREATE_NEW_CONSOLE,&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... }

我现在想要在父进程closures时终止subprocess。 接下来的另一个问题是 ,我使用Job Objects来做到这一点:

// Create and initialise the job object: HANDLE ghJob = CreateJobObject(NULL,NULL); if (ghJob == NULL) { /* Error handling... */ } else { JOBOBJECT_EXTENDED_LIMIT_@R_989_4045@ION jeli = { 0 }; // Configure all child processes associated with the // job to terminate when the parent closes: jeli.Basiclimit@R_989_404[email protected] = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE; if (! Set@R_989_4045@ionJobObject( ghJob,JobObjectExtendedLimit@R_989_4045@ion,&jeli,sizeof(jeli) )) { /* Error handling... */ } }

然后通过AssignProcesstoJobObject将创build的subprocess分配给这个工作:

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

这是有效的:因为新创build的进程被分配到JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE的作业,当父进程因任何原因closures时,subprocess会自动终止。

从Windows 8应用程序在Windows资源pipe理器中打开文件

make:g ++:找不到命令

64位Windows文件打开

如何通过Windows身份validation

从内联ASM(X64)调用printf

但是,这是我的问题 :我没有控制child.exe 。 它产生了自己的subprocess(如grandchild.exe ),所以我们有:

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

不幸的是,当我将作业对象分配给child.exe时,这个“产生的grandchild.exe ”失败。 我相信这是因为grandchild.exeinheritance我的作业定义,但是child.exe尝试将自己的作业定义应用于grandchild.exe并失败,因为在Windows 7上作业可能只与单个作业关联。 AssignProcesstoJobObject的文档说,如果希望创build不从父类inheritance作业的进程,则在调用CreateProcess时必须使用CREATE_BREAKAWAY_FROM_JOB标志。 但问题是这个调用CreateProcess发生在child.exe ,我没有访问权限。

任何人都可以想到一个解决scheme,它允许child.exe自由地产生自己的(大)subprocess,同时使我可以在parent.execlosures时终止child.exe吗?

奇怪的链接行为和未定义的符号

这个typedef是什么意思涉及LPWSTR?

不能设置POSIX消息队列属性

GTK + 3线程安全吗?

我可以进一步减less这个微小的MSVC ++项目的“私人字节”内存使用情况吗?

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

使用Set@R_989_4045@ionJobObject函数和JobObjectExtendedLimit@R_989_4045@ion选项。 该标志在MyExtendedLimit@R_989_404[email protected]climit@R_989_404[email protected]成员中设置。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐