由JOB中的进程启动的子进程是否可以设置JOB属性以脱离作业?

Vin*_*nod 4 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-objects和https://learn.microsoft.com/en-us/windows/desktop/procthread/process-creation-flags

没有说我们是否可以做到这一点。或者如果需要的话该怎么做。

我编写了一个示例应用程序,其中父进程创建一个没有 JOB_OBJECT_LIMIT_BREAKAWAY_OK 标志的作业。并编写了由家长启动的示例应用程序。在这个孩子中,我尝试设置作业属性,如下所示:

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;
}
Run Code Online (Sandbox Code Playgroud)

它不起作用,并且 JOB 属性保持不变。

RbM*_*bMm 6

对于套装,JOB_OBJECT_LIMIT_BREAKAWAY_OK您需要致电SetInformationJobObject

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

但你通过NULL这里就位句柄。ERROR_INVALID_HANDLE此时你必须得到结果。

从IsProcessInJob

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

因此系统不会将您运行的作业对象的句柄返回给您。这是设计使然。如果孩子可以将自己从工作中剔除,这会严重扼杀工作感,因为会限制孩子的进程。