71703

ПРОЦЕССЫ

Лабораторная работа

Информатика, кибернетика и программирование

В головном процессе создаются/открываются два файла: текстовый (несколько строк) и двоичный (ряд арифметических данных). Информация об открытых файлах (дескрипторы) передается в дочерние процессы на этапе их создания через командную строку.

Русский

2014-11-11

503.52 KB

11 чел.

9

БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Факультет информационных технологий
и робототехники

Кафедра «Программное обеспечение вычислительной
техники и автоматизированных систем»

О Т Ч Е Т

по лабораторной работе № 8

Дисциплина

«Системное программирование»

Тема

«пРОЦЕССЫ»

Выполнил: студент гр.107221             Ермакович Е. А.

Проверил:                                                     Разорёнов Н.А.

Минск 2013

пРОЦЕССЫ

Цель работы: ознакомление с основами создания и управления процессами в ОС WINDOWS.

Изучаемые вопросы

  1.  Структуры STARTUPINFO, PROCESS_INFORMATION.
  2.  Создание процесса.
  3.  Класс приоритета процесса.
  4.  Наследование дочерними процессами ресурсов (файлов) родительского процесса.
  5.  Окончание процесса.
  6.  Переменные окружения процесса: структура, значения.
  7.  Передача информации между процессами через среду процесса.
  8.  Список процессов.
  9.  Время выполнения процесса.

Постановка задачи

  1.    Разработать приложение, состоящее из трех процессов (головного и двух дочерних). В головном процессе создаются/открываются два файла: текстовый (несколько строк) и двоичный (ряд арифметических данных). Информация об открытых файлах (дескрипторы) передается в дочерние процессы на этапе их создания через командную строку.
  2.    В главном процессе запускаются два дочерних процесса, которые:
  3.  первый – дописывает стоку/строки в текстовый файл;
  4.  второй – дописывает число/числа в бинарный файл;
  5.  процессы отображают информацию файлов до и после их модификации.
  6.    После возвращения из дочерних процессов главный процесс отображает:
  7.  содержимое модифицированных файлов и закрывает их;
  8.  системную информацию о процессе (GetProcessInformation).

4. Модифицировать программу лабораторной работы № 8 так, чтобы она выводила в окно информацию по изучаемым вопросам. Приложение может состоять из трех процессов (головного и двух дочерних). В родительском процессе создается и выводится список процессов, который обновляется через 3 с, и другая информация по процессу.

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

6. После возвращения из дочерних процессов главный процесс отображает содержимое файла.

Ход выполнения работы

  1.  Структуры STARTUPINFO, PROCESS_INFORMATION.

Структуры STARTUPINFO и  PROCESS_INFORMATION необходимы для создания и управления процессом.

Структура STARTUPINFO используется c функцией CreateProcess(), чтобы определить оконный терминал, рабочий стол, стандартный дескриптор и внешний вид основного окна для нового процесса.

STARTUPINFO si;

ZeroMemory(&si, sizeof(STARTUPINFO));

si.cb = sizeof(STARTUPINFO);

Структура PROCESS_INFORMATION заполняется функцией CreateProcess информацией о недавно созданном процессе и его первичном потоке. В ней определены такие поля, как дескрипторы созданного процесса и его главного потока, их идентификаторы.

 

PROCESS_INFORMATION pi;  

ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));

CreateProcess(NULL, buffer, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL ,NULL, &si, &pi);  

  1.  Создание процесса.

Процесс создается с помощью функции CreateProcess(), которая возвращает TRUE в случае удачного создания процесса:

- Создается объект Win32 "процесс".

- Создается первичный поток (стек, контекст и объект "поток").

- Подсистема Win32 уведомляется о создании нового процесса и потока.

- Начинается выполнение первичного потока.

- В контексте нового процесса и потока инициализируется адресное пространство начинается выполнение программы.

BOOL CreateProcess

(

LPCTSTR lpApplicationName,                 // имя исполняемого модуля

LPTSTR lpCommandLine,                      // Командная строка

LPSECURITY_ATTRIBUTES lpProcessAttributes, // Указатель на структуру SECURITY_ATTRIBUTES

LPSECURITY_ATTRIBUTES lpThreadAttributes,  // Указатель на структуру SECURITY_ATTRIBUTES

BOOL bInheritHandles,                      // Флаг наследования текущего процесса

 DWORD dwCreationFlags,                     // Флаги способов создания процесса

 LPVOID lpEnvironment,                      // Указатель на блок среды

 LPCTSTR lpCurrentDirectory,                // Текущий диск или каталог

 LPSTARTUPINFO lpStartupInfo,               // Указатель на структуру STARTUPINFO

 LPPROCESS_INFORMATION lpProcessInformation // Указатель на структуру PROCESS_INFORMATION

);

В программе:

int n = sprintf_s(buffer, 1024, "%s", "\"child.exe\"");

sprintf_s(buffer + n, 1024 - n, "%d", hTextFile);

STARTUPINFO si;

ZeroMemory(&si, sizeof(STARTUPINFO));

si.cb = sizeof(STARTUPINFO);

PROCESS_INFORMATION pi;

ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));

CreateProcess(NULL, buffer, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL ,NULL, &si, &pi);

  1.  Класс приоритета процесса.

Параметр fdwCreate функции CreateProcess() разрешает задать и класс приоритета процесса.

При создании процесса можно задать класс его приоритета. По умолчанию система присваивает процессу класс приоритета NORMAL_PRIORITY_CLASS. Классы приоритета влияют на распределение процессорного времени между потоками процессов.

CreateProcess(NULL, buffer, NULL, NULL, TRUE, NULL, NULL ,NULL, &si2, &pi2);

SetPriorityClass(pi2.hProcess, HIGH_PRIORITY_CLASS);

  1.  Наследование дочерними процессами ресурсов (файлов) родительского процесса.

Для наследования дочерними процессами ресурсов (файлов) родительского процесса в нем необходимо объявить структуру sa (SECURITY_ATTRIBUTES). Третий параметр sa устанавливает права по совместному доступу к созданному файлу:

SECURITY_ATTRIBUTES sa = {0};

sa.nLength = sizeof(SECURITY_ATTRIBUTES);

sa.bInheritHandle = NULL;

sa.bInheritHandle = TRUE;

Затем в функции создания файла (родительский процесс) необходимо передать указатель на данную структуру:

HANDLE hTextFile = CreateFile("file.txt", GENERIC_READ | GENERIC_WRITE,

FILE_SHARE_READ | FILE_SHARE_WRITE, &sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);

HANDLE hBinaryFile = CreateFile("file.bin",GENERIC_READ | GENERIC_WRITE,

FILE_SHARE_READ | FILE_SHARE_WRITE, &sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);

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

int n = sprintf_s(buffer, 1024, "%s", "\"child.exe\"");

sprintf_s(buffer + n, 1024 - n, "%d", hTextFile);    

В дочернем процессе описатель файла получают следующим образом:

LPTSTR str = GetCommandLine();

LPTSTR sp = StrRStrI(str, NULL, "\"");

sp++;

HANDLE hFile = (HANDLE)StrToInt(sp);

В процедуре CreateProcess пятый параметр устанавливается в TRUE, что дает возможность созданному процессу наследовать все доступные (разрешено наследование) дескрипторы объектов ядра, принадлежащие родительскому процессу.

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

Процесс можно завершить четырьмя способами:

1) входная функция первичного потока возвращает управление (рекомендуемый способ);

2) один из потоков процесса вызывает функцию ExitProcess (нежелательный способ);

3) поток другого процесса вызывает функцию TerminateProcess (тоже нежелательно);

4) все потоки процесса умирают по своей воле (большая редкость).

 

В программе:

ExitProcess(0);

  1.  Переменные окружения процесса: структура, значения.

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

=::=::\ …

VarName1=VarValue1\0

VarName2=VarValue2\0

VarName3=VarValue3\0 …

VarNameX=VarValueX\0

\0

 Первая часть каждой строки - имя переменной окружения. За ним следует знак равенства и значение, присваиваемое переменной. Стоит отметить, что не только первая строка, но и другие строки в этом блоке могут начинаться символом =(недопустимые строки). Такие строки не считаются переменными окружения.

  1.  Передача информации между процессами через среду процесса.

Пользователь создает и инициализирует переменную среды, затем запускает приложение, и оно, анализируя блок, отыскивает одну или несколько «своих» переменных, а обнаружив, проверяет их значение и соответствующим образом настраивается. Инициализируем переменную среды до создания процесса:

char envalue[20] = "Binary File";

SetEnvironmentVariable("BinaryFileHeader", envalue);

Поле создания дочернего процесса отыскиваем в нем эту же переменную и считываем ее значение:

char envalue[20]="";

GetEnvironmentVariable("BinaryFileHeader", (char*) &envalue, sizeof(envalue));

SetWindowText(hDlg,envalue);

Среды дочерних процессов показаны на Рисунке 8.1.   

Рисунок 8.1 – Среды дочерних процессов  

  1.  Список процессов.

Все современные ОС содержат средства (библиотеки, такие как Tlhelp32.dll) для наблюдения за состоянием системных объектов. В основном эти средства позволяют делать «снимок» их состояния на определенный момент времени.

VOID CALLBACK UpdateTimerFunction(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)

{

 HWND hListBox = GetDlgItem(hWnd, IDC_LIST1);

 SendMessage(hListBox, LB_RESETCONTENT, 0, 0);

HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

 PROCESSENTRY32 process;

process.dwSize = sizeof(PROCESSENTRY32);

 char *buffer = new char[2024];

 if (Process32First(hSnapshot, &process))

{

 do

 {

  sprintf_s(buffer, 2024, "%u %s %u %s %s", process.th32ProcessID,"         ",process.th32ParentProcessID,"           ",process.szExeFile);

  SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)buffer);

 } while (Process32Next(hSnapshot, &process));

}

 delete buffer;

 CloseHandle(hSnapshot);

}

  1.  Время выполнения процесса

На использование процессом ресурсов ОС затрачивается некоторое время, система же предоставляет некоторые функции для отображения этой информации(время создания, время ядра и т.д).

void TimeProcess(PROCESS_INFORMATION pi, PROCESS_INFORMATION pi2,HWND hDlg)

{

 FILETIME timeCreation;

 FILETIME timeExit;

 FILETIME timeKernel;

 FILETIME timeUsed;

 SYSTEMTIME creat;

 SYSTEMTIME exit;

 char *buffer = new char[1024];

GetProcessTimes(pi.hProcess, &timeCreation, &timeExit,&timeKernel, &timeUsed);

FileTimeToSystemTime(&timeCreation, &creat);

FileTimeToSystemTime(&timeExit, &exit);

creat.wHour+=3;

sprintf_s(buffer, 1024, "%d", creat.wHour);

SetWindowText(GetDlgItem(hDlg, IDC_EDIT3), buffer);

sprintf_s(buffer, 1024, "%d", creat.wMinute);   SetWindowText(GetDlgItem(hDlg, IDC_EDIT4), buffer);

sprintf_s(buffer, 1024, "%d", creat.wSecond);

 SetWindowText(GetDlgItem(hDlg, IDC_EDIT5), buffer);

exit.wHour+=3;

sprintf_s(buffer, 1024, "%d", exit.wHour);

 SetWindowText(GetDlgItem(hDlg, IDC_EDIT6), buffer);

sprintf_s(buffer, 1024, "%d", exit.wMinute);

 SetWindowText(GetDlgItem(hDlg, IDC_EDIT7), buffer);

sprintf_s(buffer, 1024, "%d", exit.wSecond);

 SetWindowText(GetDlgItem(hDlg, IDC_EDIT8), buffer);

delete buffer;

}

  1.  Результаты работы программы

Результаты работы программного обеспечения  приведены на Рисунках 10.1 и 10.2:

Рисунок 10.1 – Дочерние процессы

Рисунок 10.2 – Родительский процесс

Выводы

  1.  С любым процессом связан блок переменных окружения (среда) – область памяти, выделенная в адресном пространстве процесса, который обычно применяется для «тонкой» настройки приложения.
  2.  Пользователь создает и инициализирует переменную среды, затем запускает приложение, и оно, анализируя блок, отыскивает одну или несколько «своих» переменных, а обнаружив, проверяет их значение и соответствующим образом настраивается.
  3.  Все процессы в системе имеют уникальные идентификаторы. Они позволяют системе различать все процессы. Пользователю такой идентификатор доступен только для чтения, он присваивается процессу на этапе его создания и не изменяется в течение всего времени работы процесса.
  4.  Для наследования дочерними процессами ресурсов (файлов) родительского процесса в нем необходимо объявить структуру sa (SECURITY_ATTRIBUTES).

 

А также другие работы, которые могут Вас заинтересовать

1790. Виховна година: Повага до себе має свій зовнішній вигляд 154.44 KB
  Навчити студентів постійно дотримуватися режиму дня, стежити за своєю ходою, поведінкою, одягом; розглянути ставлення студентів до моди і до своєї зовнішності; визначити рівень самооцінки кожного студента.
1791. Виховна година: Збережемо природу рідного краю 21.89 KB
  Вчити учнів усвідомлювати себе частиною світу природи; формувати інтерес до навколишнього середовища; розвивати увагу, спостережливість, бажання допомогти довкіллю; виховувати в школярів дбайливе і гуманне ставлення до природи, бажання милуватися її красою.
1792. Виховна година. Будь обережним на дорозі 55 KB
  Поглибити знання учнів про правила дорожнього руху, повторити основні правила пішоходів, велосипедистів, мотоциклістів, пасажирів, водіїв, сприяти розвитку мислення, мовлення, пам'яті, навичок поведінки на дорозі, виховувати повагу до оточуючих, увагу, правила ввічливості
1793. Виховна година: Правильне харчування та здоровий сон – запорука гарного сомопочуття 20.46 KB
  Продовжити знайомство з резервами самопочуння людини, значенням раціонального харчування в системі здорового способу життя, навчити розділяти індивідуальну програму харчової поведінки, продовжити знайомство з компонентами етноздоров'я населення України
1794. Виховна година: Розуміння себе 42 KB
  Довести учням ідею неповторності й унікальності кожної особистості, розвивати здібності аналізувати себе та свої вчинки, виховувати любов до себе та оточуючих, почуття справедливості та гуманності, естетичні смаки та уподобання.
1795. Виховна година: Місія 25.79 KB
  Навчити учнів правильно використовувати свої знання з різних предметів. Виховати в учнів почуття відповідальності не тільки за себе, але і за своїх знайомих і рідних,вміння правильно розприділяти свій час. Розвинути логічне мислення, правильно робити передбачення з даної теми.
1796. Толерантність. Позитивне значення толерантності у формуванні цілісної особистості молодої людини 70.5 KB
  Психологічна установка. Поняття про толерантність. Діагностика толерантної особистості. Мудрість з дерева пізнання (Обговорення висловів видатних людей про толерантність). Виконання творчого завдання в групах.
1797. Друг — це означає другий Я 74 KB
  Учити дітей сприймати різні життєві ситуації, аналізувати їх і знаходити шляхи виходу з них, виховувати у дітей правильне ставлення до таких понять як друг, дружба, розвивати в учнів загальнолюдські чесноти.
1798. Урок-виховний захід. Я і мій класний колектив 23.54 KB
  Навчати учнів культури спілкування, пошуку конструктивних способів вирішення проблемних ситуацій у класі, сприяти поліпшенню психологічного клімату в класі, налагодженню доброзичливих стосунків, виховувати в учнів повагу одне до одного, відповідальність за власні слова і вчинки.