Наследование объектов ядра дочерним процессом.



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

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

Чтобы создать наследуемый описатель, родительский процесс выделяет и инициализирует структуру SECURITY_ATTRIBUTES, а затем передает ее адрес требуемой Create-функции.

SECURITY_ATTRIBUTES sa;

sa.nLength = sizeof(sa);

sa.lpSecurityDescriptor = NULL;

sa.bInheritHandle = TRUE; // делаем возвращаемый описатель наследуемым

HANDLE hMutex = CreateMutex(&sa, FALSE, NULL);

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

Следующий этап — родительский процесс порождает дочерний. Это делается с помощью функции CreateProcess:

Параметр bInheritHandles. Создавая процесс, Вы обычно передаете в этом параметре FALSE, тем самым сообщая системе, что дочерний процесс не должен наследовать наследуемые описатели, зафиксированные в таблице родительского процесса. Если же Вы передаете TRUE, дочерний процесс наследует описатели родительского. Тогда операционная система создает дочерний процесс, но не дает ему немедленно начать свою работу. Сформировав в нем, как обычно, новую (пустую) таблицу описателей, она считывает таблицу родительского процесса и копирует все ее действительные записи в таблицу дочернего — причем в те же позиции.

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

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

 

Класс процесса.

Соответственно все процессы разделены на классы, каждый из которых управляется в соответствии со своими правилами, например имеются классы процессов разделения времени и реального времени, а так же класс системных процессов.!

В современном UNIX используются три класса планируемых процессов:

• Процессы разделения времени;

• Системные процессы;

• Процессы реального времени (с фиксированным приоритетом).

 

Текущий директорий процесса.

Поток может получать и устанавливать текущие каталог и диск для процесса с помощью двух функций:

DWORD GetCurrentDirectory( DWORD cchCurDir, PTSTR pszCurDir);

BOOL SetCurrentDirectory(PCTSTR pszCurDir);

Текущие каталоги для процесса

Система отслеживает текущие диск и каталог для процесса, но не текущие каталоги на каждом диске. Однако в операционной системе предусмотрен кое-какой сервис для манипуляций с текущими каталогами на разных дисках. Он реализуется через переменные окружения конкретного процесса. Например:

=C:=C:\Utility\Bin

=D:=D:\Program Files

Эти переменные указывают, что текущим каталогом на диске С является \Utility\Bin, а на диске D — \Program Files.

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

Если родительский процесс создает блок переменных окружения и хочет передать его дочернему процессу, тот не наследует текущие каталоги родительского процесса автоматически. Вместо этого у дочернего процесса текущими на всех дисках становятся корневые каталоги. Чтобы дочерний процесс унаследовал текущие каталоги родительского, последний должен создать соответствующие переменные окружения (и сделать это до порождения другого процесса). Родительский процесс может узнать, какие каталоги являются текущими, вызвав GetFullPathName:

DWORD GetFullPathName( PCTSTR pszFile, DWORD cchPath,

PTSTR pszPath, PTSTR *ppszFilePart);

Например, чтобы получить текущий каталог на диске С, функцию вызывают так:

TCHAR szCurDir[MAX_PATH];

DWORD GetFullPathName(TEXT("C:"), MAX_PATH, szCurDir, NULL);

Получение инф-ции о процессе

Для снимка процесса используется функция

CreateToolhelp32SnapShot(

DWORD dwflags,

DWORD th32ProcessID

)

Для получения инфы о процессе используют Process32First, Process32Next

Указатель на

BOOL WINAPI Process32First(

HANDLE hSnapshot,

LPPROCESSENTRY32 lppe

);

Указатель на PROCESSENTRY32 структуру. Она содержит информацию о процессе, такую как имя исполняемого файла, идентификатор процесса, и идентификатор родителя данного процесса.

 

Окончание процесса

Независимо от того, как именно Вы создали объект ядра, по окончании работы с ним его нужно закрьть вызовом CloseHandle

BOOL CloseHandle(HANDLE hobj);[1]

Эта функция сначала проверяет таблицу описателей, принадлежащую вызывающему процессу, чтобы убедиться, идентифицирует ли переданный ей индекс (описатель) объект, к которому этот процесс действительно имеет доступ. Если переданный индекс правилен, система получает адрес структуры данных объекта и уменьшает в этой структуре счетчик числа пользователей; как только счетчик обнулится, ядро удалит объект из памяти.


Дата добавления: 2019-02-13; просмотров: 638; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!