Может ли дочерний процесс, который был запущен процессом в JOB, установить для свойств JOB отрыв от работы? - PullRequest
0 голосов
/ 31 августа 2018

Дочерний процесс является частью задания и запускается процессом, который создает задание. Родительский процесс уже не установил свойства JOB для разрешения отрыва от работы. Флаг «JOB_OBJECT_LIMIT_BREAKAWAY_OK» требуется установить на JOB, чтобы разрешить дочерним процессам отрываться от задания, но он не установлен.

Может ли дочерний процесс изменить свойства этого задания и установить флаг JOB_OBJECT_LIMIT_BREAKAWAY_OK, чтобы его или его дочерние процессы могли работать свободно от JOB. В сети искал, но нигде не нашел, можно ли это сделать.

Уже ссылающиеся ссылки

https://docs.microsoft.com/en-us/windows/desktop/procthread/job-objects и https://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 голосов
/ 31 августа 2018

для набора JOB_OBJECT_LIMIT_BREAKAWAY_OK вам нужно позвонить SetInformationJobObject

для вызова SetInformationJobObject вам нужен дескриптор для задания, пределы которого устанавливаются.

но вы передаете NULL здесь на место дескриптор. в результате вы должны получить ERROR_INVALID_HANDLE на данный момент.

из IsProcessInJob

Приложение не может получить дескриптор объекта задания, в котором он работает, если у него нет имени объекта задания. Тем не менее, приложение может вызывать функцию QueryInformationJobObject с помощью NULL для получения информации об объекте задания.

, чтобы система не возвращала вам дескриптор объекта задания, в котором вы работаете. это по замыслу. если ребенок может отстранить себя от работы, это серьезное убийственное чувство работы для ограничения дочерних процессов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...