Запуск. Создание процесса.
ЛЕКЦИЯ №9
Способы взаимодействия между процессами.
1. Общая память(самый быстрый способ взаимодействия)
Этот способ требует строгой синхронизации данных. Типы данных должны совпадать по структуре, должна совпадать последовательность полей структур данных и выравнивание (размер, с границы которого имеет право начинаться новое поле структуры) должно совпадать.
2. Сигналы.
Один процесс передает сигналы другому (информация, которая передается процессу – это номер сигнала). Сигнал очень похож на прерывание: у него есть номер и он обязателен к выполнению.
3. Сообщение.
Структура данных, которая может передаваться от одного процесса другому. В зависимости от операционной системы и типа сообщения могут быть строго стандартизированы. В сообщении нельзя, как правило, передавать указатель, потому что у процессов разные виртуальные пространства и адресный указатель одного пространства неравен адресному указателю другого процесса.
4. Каналы (pipe)
Это специального вида файл, открываемый между двумя процессами. Это файл одностороннего доступа с последовательным доступом, как правило ограничен в объеме.
5. Сокеты.
Способ сетевого взаимодействия.
Управление процессами в среде Window’s.
В Window’s многопоточная многозадачность. Имеется 32 приоритета, которые поделены на 6 классов:
1. IDLE
2. BELOW_NORMAL
3. NORMAL
4. ABOVE_NORMAL
5. HIGH
6. REALTIME
BOOL CreateProcess(
LPCTSTR AppName,
LPTSTR CmdLine,
LPSECURITY ATTRIBUTES ProcAttr,
LPSECURITY ATTRIBUTES ThreadAttr,
BOOL InheritHaudles,
DWORD CreationFlag,
LPVOID Environmint,
LPCTSTR Directory,
LPSTARTUPINFO info,
LPPROCESS_INFORMATION procInfo);
Результат – запущен/не запущен процесс.
Параметры:
1) имя программы, которую запускаем. Если имя состоит из слов, разделенных пробелом, то необходимо его заключить в «». Пнрывй параметр может быть пустым указателем.
2) строка, но не константная. Нужно завести строку, занести туда командную строку и передать как параметр. Если первый параметр NULL, то первое имя файла в командной строке рассматривается как имя запускаемого файла и, если у этого имени нет пути, то сперва операционная система будет искать его в текущем каталоге, а потом, если не найдет, во всех каталогах переменной окружения path.
3) 4)LPSECURITY ATTRIBUTES - структура данных, которая описывает атрибуты безопасности любого объекта. по умолчанию может быть NULL.
5) признак – будет ли запускаемый процесс наследовать ресурсы процесса
родителя.
6) флаги создания: указывается класс приоритета. Если флаг не указан и у
родительского класса стоит приоритет IDLE, BELOW_NORMAL, то дочерний
класс наследует, если NORMAL и выше – не наследует.
7) необязательный (NULL) указатель на область памяти, содержащей переменные среды окружения. Если NULL, то операционная система делает для нашего процесса копию своих переменных окружения, иначе область памяти должна быть представлена в виде: <пер1>=<знач1>\0<пер2>=<знач2> \0…\0\0 – в этом случае операционная система больше не добавляет в список переменных.
8) Каталог, который будет текущим при запуске приложения. Можно указать NULL, тогда текущим будет каталог, который записан в системной переменной %SYSTEM_ROOT%.
9) LPTSATRUPINFO – огромная структура, которая описывает параметры запуска программ, постоянно увеличивается.
10) выходной параметр. Надо передать указатель на переменную типа Process_Information. В структуре Process_Information 4 поля, два из них это:
1) HANDLE hProcess – дескриптор процесса
2) HANDLE hThread - дескриптор главного потока.
VOID ExitProcess( UINT ExitCode) – выход из программы. Функций осуществляет так называемое «магическое» завершение. Все заинтересованные стороны(системные библиотеки,…) получают уведомление о завершении процесса.
ExitCode – число – код возврата.
BOOL TerminateProces ( HANDLE h,
UINT ExitCode)
Прерывает любой процесс. Сперва пытается осуществить «мягкий» выход, при неудаче просто выкидывает его - «жесткий» выход.
Возвращаемое значение: завершен процесс или нет, так как на завершение процесса может не быть прав.
HANDLE GetCurrentProcess() – возвращает собственный дескриптор.
LPTSTR GetCommandLine() – получить собственную командную строку.
BOOL GetProcessAffinityMask(
HANDLE h,
LPDWORD ProcessMask,
LPDWORD SystemMask)
Побитовая маска, которая указывает, на каких процессорах может работать процесс.