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

 

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

78968. Натурфилософская и позитивистская и диалектическая концепции взаимосвязи философии и науки 43.5 KB
  Натурфилософская и позитивистская и диалектическая концепции взаимосвязи философии и науки.Натурфилософская концепция Сосуществования философии и науки как самостоятельных и во многом различающихся по предметам средствам методам и функциям форм познавательной и ориентировочной деятельности человека был сформулирован ряд концепций об их взаимоотношении. Кратко сущность концепции может быть выражена формулой: Философия наука наук что означает: гносеологический приоритет философии как более фундаментального вида знания по сравнению с...
78969. Чувственное, рациональное, интуитивное в научном познании и творчестве 28.5 KB
  Чувственность рациональность и интуиция – основные способности человека которые необходимы как в научном так и в ненаучном познании. Ощущения – знания об отдельных свойствах предмета Восприятие – целостное восприятие предмета Представление – воспроизведение предметов по памяти фантазия воображение На уровне восприятия возможна интуиция. В научном обществе помимо логических доказательств определений обоснований важное значение имеет игра воображение фантазия интуиция. Интуиция – это непосредственное знание полученное без обращений...
78970. Эмпирический уровень научного познания и его методы 33 KB
  Эмпирический уровень научного познания и его методы.Традиционно принято различать два уровня научного познания: эмпирический и теоретический. Структура эмпирического знания. Несмотря на близость понятий чувственного и эмпирического уровня знания между ними не может иметь место логическая выводимость одного вида знания из другого.
78971. Наблюдение и эксперимент в научном познании, виды экспериментов. Роль приборов 31 KB
  Все приборы условно можно разделить на два класса качественные и количественные. Качественные приборы используют когда интересуются качественной стороной объекта если она не может быть получена непосредственно с помощью органов чувств.В зависимости от выполняемых функций качественные приборы делят на 3 группы:Приборыусилители применяются в тех случаях когда идущие от объекта сигналы остаются за порогом ощущений когда особенности среды затрудняют изучение сигналов. Эти приборы предназначены для изучения класса явлений объективные...
78972. Формы развития научных знаний: проблема, факт, гипотеза, теория, научно-исследовательская программа 37.5 KB
  Проблема - объективно возникающий в ходе развития познания вопрос или комплекс вопросов, решение которых представляет существенный практический или теоретический интерес. Проблема в науке - это такая задача или вопрос
78973. Изменчивость научного знания как проблема философии науки. Представление о движущих силах развития научного знания. 45 KB
  Изменчивость научного знания как проблема философии науки. Представление о движущих силах развития научного знания. XX века в качестве оппозиции экстернализму подчеркивавшему фундаментальную роль социальных факторов как на этапе генезиса науки так и на всех последующих этапах развития научного знания. Последнему принадлежит наиболее значительная попытка обоснования правомерности интерналистской программы развития научного знания.
78974. Теоретический уровень научного познания и его методы 37 KB
  Теоретический уровень научного познания и его методы Теоретический уровень высший уровень научного познания включает факты добытые эмпирическим путем предшествующие развитию науки а также логические выводы добытые разумом человека. Абстрагирование Процесс познания всегда начинается с рассмотрения конкретных чувственно воспринимаемых предметов и явлений их внешних признаков свойств связей. является необходимым моментом процесса познания.
78975. Кумулятивистская и антикумулятивисткая модели развития науки, концепции Поппера, Куна, Лакатоса 30.5 KB
  Кумулятивистская и антикумулятивисткая модели развития науки концепции Поппера Куна Лакатоса. Концепция Куна Кун считает что развитие науки представляет поцесс поочередной смены двух периодов – нормальной науки и научной революции. Причем последние гораздо более редки в истории развития науки по сравнению с первыми. Характер концепции Куна определяется пониманием научного сообщества члены которого разделяют определенную парадигму приверженность к которой обуславливается положением его в данной социальной организации науки принципами...
78976. КОНЦЕПЦИЯ НАУЧНЫХ РЕВОЛЮЦИЙ Т.КУНА 40 KB
  История науки по Куну: Согласно книге Структура научных революций Т.Куна историю науки можно представить следующей схемой: 1 При переходе к зрелой науке на основе идей одной или нескольких научных школ возникает общепринятая парадигма; 2 одно из главных направлений деятельности нормальной науки – обнаружение и объяснение фактов как фактов подтверждающих парадигму; 3 при таком исследовании часть фактов трактуется как аномалии – факты противоречащие парадигме; 4 в период кризиса доверие к парадигме в известной степени подорвано но...