可以通过JOB中的进程启动子进程,将JOB属性设置为脱离作业吗?

问题描述 投票:3回答:1

子进程是作业的一部分,由创建作业的进程启动。父进程尚未设置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属性保持不变。

c++ windows winapi visual-c++
1个回答
4
投票

设置JOB_OBJECT_LIMIT_BREAKAWAY_OK你需要调用SetInformationJobObject

对于调用SetInformationJobObject,您需要处理其限制正在设置的作业。

但你把NULL放在这里就位。结果你必须得到ERROR_INVALID_HANDLE

来自IsProcessInJob

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

因此系统特殊不会返回您运行的作业对象的句柄。这是设计的。如果孩子可以从工作中解脱出来,这会严重扼杀工作感,限制孩子的过程。

© www.soinside.com 2019 - 2024. All rights reserved.