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

 

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

16777. Госты и пробы (золото, серебро) 124.5 KB
  Госты и пробы золото серебро Для золота существуют утвержденные ГОСТом цифровые значения пробы указывающие на количество драгоценного металла содержащегося в 1000 частях сплава. Проба присваивается каждому драгоценному сплаву. ГОСТ 683585 преду...
16778. ДАЛЬНЕВОСТОЧНАЯ ЗОЛОТОДОБЫВАЮЩАЯ ПРОМЫШЛЕННОСТЬ И ЕЕ ВЛИЯНИЕ НА ОСВОЕНИЕ РЕГИОНА (ВТОРАЯ ПОЛОВИНА ХIХ в. – 1917 г.) 346 KB
  Маркова Нина Анатольевна ДАЛЬНЕВОСТОЧНАЯ ЗОЛОТОДОБЫВАЮЩАЯ ПРОМЫШЛЕННОСТЬ И ЕЕ ВЛИЯНИЕ НА ОСВОЕНИЕ РЕГИОНА ВТОРАЯ ПОЛОВИНА ХIХ в. – 1917 г. ОБЩАЯ ХАРАКТЕРИСТИКА РАБОТЫ Актуальность исследования. Золото традиционно является валютным металлом играет роль резер
16779. Добыча драгоценных металлов из промышленных отходов 66.5 KB
  Добыча драгоценных металлов из промышленных отходов Сразу же хочу напомнить читателям об уголовной ответственности существующей на момент написания этих строк за самодеятельную добычу драгоценных металлов из промышленных отходов. Такое положение вещей не может дол
16780. Добыча россыпного золота в XXI веке 179 KB
  Добыча россыпного золота в XXI в. Б.К.Кавчик ОАО Иргиредмет Добыча россыпного золота ведется в России уже почти 200 лет и в настоящее время ее объем ежегодно составляет около 50 т. Однако запасы россыпного золота близки ...
16781. Золотая добыча 89.5 KB
  Золотая добыча Мировые цены на золото сейчас как никогда высоки: в марте 2008 года котировки этого драгметалла превысили 1 тыс. за тройскую унцию. Однако отечественная золотодобывающая отрасль вряд ли сможет оперативно отреагировать на резкий рост ценовой конъюнктуры. ...
16782. Золотая лихорадка или роль золота в истории 145 KB
  Золотая лихорадка или роль золота в истории. Золото расковывается до толщины 01 микрометра. 28 грамм хватит на лист площадью около 17 кв. метров Цивилизация человечества невозможна без таких металлов как медь железо затем алюминий и пр. Но золото представляется...
16783. Золото и его добыча 56 KB
  Золото ЗОЛОТО лат. Aurum – драгоценный металл химический элемент I группы периодической системы атомный номер 79 атомная масса 1969665. Этот благородный металл желтого цвета ковкий его плотность составляет 1932 г/см3 tпл 10644оC. Химически весьма инертен на воздухе не изменяет...
16784. ЗОЛОТО ГДЕ ОНО В РЕКЕ 141 KB
  ЗОЛОТО ГДЕ ОНО В РЕКЕ ЗОЛОТО ТАМ ГДЕ ТЫ ЕГО НАХОДИШЬ Россыпное золото россыпи находят в осадочных отложениях в руслах древних рек и в отложениях современных потоков. Россыпи бывают аллювиальными террасовыми русловыми донные косовые. Террасовые отложения
16785. Золото есть 87 KB
  Золото есть Если бы Джек Лондон оценил сегодня состояние золотодобывающей отрасли в Сибири то наверняка написал бы: Золота там нет. Лет 100 назад во времена освоения богатейших россыпей в Северной Америке когда старателю требовались только лоток и лопата за