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

Windows API作业对象:不要传递给孙子们,第1张

概述Windows API作业对象:不要传递孙子

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

int wmain(int argc,WCHAR *argv[]) { STARTUPINFO startupInfo = createStartupInfo(); PROCESS_informatION 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_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将创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标志。 该标志防止子进程被自动分配给作业。

使用SetinformationJobObject函数和JobObjectExtendedlimitinformation选项。 该标志在MyExtendedlimitinformation.Basiclimitinformation.limitFlags成员中设置。

总结

以上是内存溢出为你收集整理的Windows API作业对象:不要传递给孙子们全部内容,希望文章能够帮你解决Windows API作业对象:不要传递给孙子们所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1269741.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存