我有一个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] 举报,一经查实,本站将立刻删除。