71703

ПРОЦЕССЫ

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

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

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

Русский

2014-11-11

503.52 KB

12 чел.

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).

 

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

54556. A compiler system for windows 7.36 MB
  I was working since several years in a compiler environment project. I had written an editor ‘Wedit’ and sold some copies of it to fellow programmers in Paris. But my editor project was stuck: it missed the compiler. Once people bought the compiler with its integrated editor, they wouldn’t think about using any other one. The editor was actually considered as an afterthought. The effort of learning a new editor was considered too big. Besides, the new programming environments were more and more closed.
54557. Отношения собственности и их реализация 18.04 KB
  В системе экономических отношений собственность всегда ассоциируется с определенными вещами, благами, продуктами интеллектуального труда. Но это лишь формы материализации собственности.
54558. Сон – залог здоровья 90 KB
  Задачи: расширить представление о сне; проделать опыты и упражнения, показывающие влияние сна на здоровье человека; сделать выводы, предложить здоровые нормы поведения перед сном; воспитывать потребность в здоровом образе жизни.
54559. Сущность, место и роль государственной собственности 18.58 KB
  Собственность относится к числу наиболее важных и сложных проблем экономики, и экономической теории. История экономической жизни общества в периоды повышенной социальной активности ведет, как правило, к перераспределению объектов и прав собственности.
54560. Основные черты рыночной экономики. Функции рынка 19.07 KB
  Современная экономика всех развитых государств носит рыночный характер, это объясняется тем, что рыночная экономика оказалась наиболее эффективной и гибкой для решения основных экономических проблем.
54561. Основні методи доведення нерівностей 255.5 KB
  Мета: освітня: систематизувати та відкоригувати вміння та навички доводити нерівності різними методами: використання означення нерівності доведення від супротивного використання відомої нерівності виділення квадрата двочлена застосування ключових нерівностей; перевірити та встановити рівень оволодіння учнями способів доведення нерівностей вміння та навички у нестандартних ситуаціях творчість учнів у завданнях найвищого рівня завданнях олімпіадного характеру; повторити глибоко осмислити навчальний матеріал з метою формування...
54562. Розробка уроків (пар) алгебри для 9-го класу з теми «Нерівності» 865 KB
  Разом з розвязаними вправами вправами для розвязування біля дошки приклади для самостійного розвязку учнями роботою з картками домашніми завданнями завданнями для повторення матеріалу за попередні класи та теми все це є єдиним цілим для вчителя який візьме дану розробку і буде спиратися на неї як на свій власний конспект. Включення ж до теми методу інтервалів є логічним кроком при розгляді теорії нерівностей адже він просто губиться при подальшому викладанні і при нагоді може слугувати методом розвязування квадратичних...
54563. Розвязування квадратичних нерівностей 231 KB
  Мета уроку: Формувати вміння та навички з розвязування Квадратичних нерівностей; розвивати логічне мислення, мову учнів; виховувати цікавість до математики, культуру математичних записів. Тип уроку: урок формування вмінь і навичок. Обладнання: компютера, таблиці.
54564. Лінійні нерівності з однією змінною 51.5 KB
  Мета уроку: систематизувати і узагальнити знання учнів по темі продовжити формувати практичні навики по розвязуванню нерівностей; на прикладах показати учням застосування нерівностей до практичних задач; стежити за дотриманням учнями графічної культури; розвивати математичну мову логічне мислення; вчити учнів працювати з підручником. Що називається розв`язком нерівності Що означає розвязати нерівність 4. Сформулювати властивості які використовуються при розвязуванні нерівностей. Ті учні які під час попередньої...