由JOB中的流程启动的子流程能否将JOB属性设置为脱离工作状态?

时间:2018-08-31 09:09:03

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

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

子进程可以更改此作业属性并设置标志JOB_OBJECT_LIMIT_BREAKAWAY_OK,以便其子进程可以从JOB中免费运行。 在线搜索,但找不到任何地方可以做到这一点。

已经引用的链接

https://docs.microsoft.com/en-us/windows/desktop/procthread/job-objectshttps://docs.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属性保持不变。

1 个答案:

答案 0 :(得分:4)

对于设置JOB_OBJECT_LIMIT_BREAKAWAY_OK,您需要致电SetInformationJobObject

对于呼叫SetInformationJobObject,您需要处理已设置其限制的作业。

但是您在此处传递NULL到位句柄。结果,此时您必须获得ERROR_INVALID_HANDLE

来自IsProcessInJob

  

应用程序无法获取作业对象的句柄,其中   它正在运行,除非它具有作业对象的名称。但是,   应用程序可以调用QueryInformationJobObject函数   与NULL一起获得有关作业对象的信息。

因此系统特殊状态不返回您正在运行的作业对象的句柄。这是设计使然。如果孩子可以将自己从工作中解脱出来,那么这种严重的杀人意识会限制孩子的工作。