c++ - 由 JOB 中的进程启动的子进程能否将 JOB 属性设置为脱离作业?

标签 c++ windows winapi visual-c++

子进程是作业的一部分,由创建作业的进程启动。 父进程尚未设置作业属性以允许脱离作业。需要在 JOB 上设置“JOB_OBJECT_LIMIT_BREAKAWAY_OK”标志以允许子进程脱离作业,但未设置。

子进程能否更改此作业属性并设置标志 JOB_OBJECT_LIMIT_BREAKAWAY_OK 以便它或它的子进程可以不受 JOB 影响运行。 在线搜索但没有找到任何地方是否可以做到这一点。

已经引用的链接

https://learn.microsoft.com/en-us/windows/desktop/procthread/job-objectshttps://learn.microsoft.com/en-us/windows/desktop/procthread/process-creation-flags

没有说我们是否可以那样做。或者,如果需要,那么该怎么做。

我编写了一个示例应用程序,其中父进程创建了一个没有 JOB_OBJECT_LIMIT_BREAKAWAY_OK 标志的作业。并编写了由 parent 开始的示例应用程序。在这个 child 中,我尝试设置 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 属性保持不变。

最佳答案

对于设置JOB_OBJECT_LIMIT_BREAKAWAY_OK,您需要调用SetInformationJobObject

电话SetInformationJobObject您需要处理正在设置限制的工作。

但是您在此处传递了 NULL 句柄。因此此时您必须得到 ERROR_INVALID_HANDLE

来自 IsProcessInJob

An application cannot obtain a handle to the job object in which it is running unless it has the name of the job object. However, an application can call the QueryInformationJobObject function with NULL to obtain information about the job object.

所以系统特殊不会返回给你运行的作业对象的句柄。这是设计使然。如果 child 可以将自己从工作中解脱出来,这会严重扼杀工作意识,以限制子进程。

关于c++ - 由 JOB 中的进程启动的子进程能否将 JOB 属性设置为脱离作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52112113/

相关文章:

C++ WINAPI 窗口不刷新

c++ - 复制构造函数中的深层复制问题

javascript - 自动从网络打印 Excel 文件

c++ - 在哪里存储数据?

c - 在 C 中构建 Windows UI 是否有一种轻松的方法?

windows - 如何使用 Delphi 查找 Windows 用户(不是当前用户)的配置文件目录?

c++ - 多线程环境中的静态局部变量初始化

c++ - 通过引用传递仿函数,我在 VS2012 上运行它,为什么会出错?

c++ - sizeof 运算符生成的数据类型

c++ - 如何在不显示文本的情况下分配 Win32 EDIT 控件的窗口名称?