由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
Can a child process which was started by a process in JOB, set JOB properties to breakaway from job?
子进程是作业的一部分,由创建作业的进程启动。 父进程尚未设置 JOB 属性以允许脱离作业。需要在 JOB 上设置"JOB_OBJECT_LIMIT_BREAKAWAY_OK"标志以允许子进程脱离作业,但未设置。
子进程是否可以更改此作业属性并设置标志JOB_OBJECT_LIMIT_BREAKAWAY_OK,以便它或其子进程可以在没有 JOB 的情况下运行。 在线搜索,但没有找到是否可以做到这一点。
已引用的链接
https://learn.microsoft.com/en-us/windows/desktop/procthread/job-objects 和 https://learn.microsoft.com/en-us/windows/desktop/procthread/process-creation-flags
没有说我们是否可以做到这一点。或者如果需要,那么如何做到这一点。
我编写了一个示例应用程序,其中父进程创建一个没有JOB_OBJECT_LIMIT_BREAKAWAY_OK标志的作业。并编写了由父母启动的示例应用程序。在这个孩子中,我尝试设置如下 JOB 属性:
if (bInJob)
{
JOBOBJECT_EXTENDED_LIMIT_INFORMATION info1 = {};
QueryInformationJobObject(NULL, JobObjectBasicLimitInformation, &info1.BasicLimitInformation, sizeof(info1.BasicLimitInformation), NULL);
DWORD dwLimitFlags = info1.BasicLimitInformation.LimitFlags;
SetLastError(0);
info1.BasicLimitInformation.LimitFlags |= JOB_OBJECT_LIMIT_BREAKAWAY_OK;
if (SetInformationJobObject(NULL, JobObjectExtendedLimitInformation, &info1, sizeof(info1)))
{
cout << "failed";
}
DWORD fileError = GetLastError();
JOBOBJECT_BASIC_LIMIT_INFORMATION info = {};
QueryInformationJobObject(NULL, JobObjectBasicLimitInformation, &info, sizeof(info), NULL);
dwLimitFlags = info.LimitFlags;
}
它不起作用,JOB 属性保持不变。
对于需要调用SetInformationJobObject
JOB_OBJECT_LIMIT_BREAKAWAY_OK
对于呼叫SetInformationJobObject
,您需要处理正在设置限制的作业。
但是你在这里传递NULL
句柄。 因此,此时您必须ERROR_INVALID_HANDLE
。
与IsProcessInJob
相比
应用程序无法获取作业对象的句柄,其中 除非它具有作业对象的名称,否则它正在运行。但是,一个 应用程序可以调用
QueryInformationJobObject
函数 使用NULL
获取有关作业对象的信息。
因此,系统特殊不会返回给您运行作业对象的句柄。 这是设计使然。 如果孩子能把自己从工作中移除,这种严重的杀伤感,就会限制子进程。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 如何在24位SDL_Surface上设置像素的颜色
- std::设置自定义比较器
- 如何设置一个范围来提取我想要获得的信息
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 通过选项卡的文本设置QTabWidget顺序
- 将特征矩阵的向量设置为0
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?