Запуск. Создание процесса.

ЛЕКЦИЯ №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)

Побитовая маска, которая указывает, на каких процессорах может работать процесс.