close

Вход

Забыли?

вход по аккаунту

?

лаб8 (4)

код для вставкиСкачать
Министерство образования и науки Российской Федерации Федеральное агентство по образованию Государственное образовательное учреждение высшего профессионального образования "Алтайский государственный технический университет им. И.И. Ползунова"
Факультет (институт) Инженерно-физический
Кафедра Систем автоматизированного проектирования
наименование кафедры
Отчет защищен с оценкой____________
Преподаватель _________Качесова Л.Ю.
(подпись) (и.о.фамилия) "____"___________ 200_ г.
дата
Отчет
по лабораторной работе № 8
Операционная система Linux. Процессы.
название лабораторной работы
по дисциплине Операционные системы
наименование дисциплины
Студент группы САПР-82, Кривицкая Н.
и.о., фамилия
Преподаватель ________Качесова Л.Ю.
и.о., фамилия
БАРНАУЛ 2009
Цель: научиться использовать системные функции для получения информации о процессах и открытых ими модулях, изменять параметры процесса, приоритет выполнения и пр.
Описание:
1. Получение "мгновенного снимка" системы. 1.1.Функция CreateToolhelp32SnapShot. В операционной системе Windows отсутствует возможность наблюдать за процессами в реальном времени. Имеется лишь возможность периодически делать так называемые моментальные снимки процессов, что и осуществляет данная системная функция;
2. Информация о процессах. Для просмотра списка загруженных процессов определены следующие функции: 2.1.Process32First - получение информации о первом загруженном процессе;
2.2.Process32Next - получение информации об очередном загруженном процессе; 3. Информация о кучах (heap). Для просмотра куч определены следующие функции:
3.1.Heap32ListFirst - информация о куче, предоставляемой выбранному процессу по умолчанию; 3.2.Heap32ListNextt - информация об очередной куче, предоставляемой выбранному процессу по умолчанию; 3.3.Heap32First - информация о первом блоке в выбранной куче; 3.4.Heap32Next - информация об очередной блоке в выбранной куче; 4. Информация о виртуальной памяти. Для просмотра виртуальной памяти определена следующая функция: 4.1.Toolhelp32ReadProcessMemory - позволяет получить информацию о регионах адресного пространства выбранного процесса. Процесс определяется по идентификатору. 5. Информация о потоках. Для просмотра списка созданных потоков определены следующие функции: 5.1.Thread32First - получение информации о первом потоке выбранного процесса. Процесс определяется по идентификатору.; 5.2.Thread32Next - получение информации об очередном потоке выбранного процесса. Процесс определяется по идентификатору; 6. Информация о модулях. Для просмотра списка загруженных модулей определены следующие функции: 6.1.Module32First - получение информации о первом модуле выбранного процесса. Процесс определяется по идентификатору.; 6.2.Module 32Next - получение информации об очередном модуле выбранного. Процесс определяется по идентификатору; Алгоритм получения информации о всех загруженных процессах имеет следующий вид: 1. В области переменных определяется переменная, имеющая тип tProcessEntry32, представляющий структуру, куда будет заноситься информации об очередном процессе; 2. Вызывается функция CreateToolhelp32SnapShot для создания "моментального снимка процессов операционной системы" с константой TH32CS_SNAPPROCESS или TH32CS_SNAPALL в качестве параметра;
3. Вызывается функция Process32First, которая возвращает в структуре tProcessEntry32 информацию о первом выполняемом процессе и описатель (дескриптор) следующего процесса в цепочке процессов; 4. В цикле вызывается функция Process32Next, которая возвращает в структуре tProcessEntry32 информацию об очередном выполняемом процессе и описатель (дескриптор) следующего процесса в цепочке процессов. Цикл опроса продолжается до тех пор, пока результат выполнения функции Process32Next не станет равным false.
5. Для каждого процесса (кроме некоторых системных) можно получить список открытых ими модулей, для чего вызывается та же системная функция CreateToolhelp32SnapShot, которой в качестве параметров передаются PID процесса и константа TH32CS_SNAPMODULE.Структура tProcessEntry32 имеет следующий вид: typedef struct tagPROCESSENTRY32 { DWORD dwSize; DWORD cntUsage; DWORD th32ProcessID; DWORD th32DefaultHeapID; DWORD th32ModuleID; DWORD cntThreads; DWORD th32ParentProcessID; LONG pcPriClassBase; DWORD dwFlags; char szExeFile[MAX_PATH]; } PROCESSENTRY32; typedef PROCESSENTRY32 * PPROCESSENTRY32; typedef PROCESSENTRY32 * LPPROCESSENTRY32; Здесь th32ProcessID - PID процесса, th32ParentProcessID - PPID (PID родительского процесса), szExeFile - имя исполняемого файла, pcPriClassBase - приоритет процесса, cntThreads - число выполняющихся потоков (threads) процесса. Более детальное описание имеется в help по программированию в Win32 в Delphi или в библиотеке MSDN от Microsoft. Для уничтожения процесса используется системные функции: OpenProcess и TerminateProcess. Первой нужно передать PID и константу PROCESS_TERMINATE, а второй передается результат выполнения первой. Не каждый процесс возможно убить таким способом. Для изменения проритета используется системные функции: OpenProcess и SetPriorityClass. Первой нужно передать PID и константу PROCESS_SET_INFORMATION, а второй передается результат выполнения первой. В Windows существует 4 типа приоритета для процессов:
1. Idle (IDLE_PRIORITY_CLASS) - процесс будет выполняться только в свободной время (когда процессор простаивает).
2. Normal (NORMAL_PRIORITY_CLASS) - процесс будет выполняться по очереди с другими (обычный режим).
3. High (HIGH_PRIORITY_CLASS) - высокий приоритет 4. Real time (REAL_TIME_PRIORITY_CLASS) - приоритет реального времени.
Задание для лабораторной работы :
1. Используя любую удобную для Вас среду разработки (C++, Delphi, ...) создайте оконное приложение Windows с интерфейсом как показано ниже: 2. После запуска программа должна показывать процессы операционной системы Windows XP (окно слева). 3. При перемещении курсора по процессам в окне слева - в окне справа должен отображаться список модулей открытых текущим процессом. 4. При нажатии на кнопку "Обновить" обновляется список процессов в окне слева. 5. При нажатии на кнопку "Уничтожить" делается попытка убить выделенный процесс. Если не удается, то сообщение об этом выводится в статусную строку. 6. При нажатии на кнопку "Изменить приоритет" делается попытка изменить приоритет у выделенного процесса на тот, что выбран в выпадающем списке. Если не удается, то сообщение об этом выводится в статусную строку. 7. При разработке в случае сомнений запускайте присоединенную к лабораторной работе программу process.exe - Ваша программа должна работать точно также. 8. В отчете привести описание работы вашей программы, исходный код и скриншоты.
Программный код:
Unit 1.cpp
#include <vcl.h>
#pragma hdrstop
#include <tlhelp32.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int pri,n,n2;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{ StringGrid2->Cells[0][0]="EXE-файл";
StringGrid2->Cells[1][0]="PID";
StringGrid2->Cells[2][0]="PPID";
StringGrid2->Cells[3][0]="THREADS";
StringGrid2->Cells[4][0]="Приоритет";
ProgressBar1->Max=10;
ProgressBar1->Min=0;
ProgressBar1->Position=0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Button1Click(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) //обновить
{
int i=1;
HANDLE pSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
bool bIsok = false;
PROCESSENTRY32 ProcEntry;
ProcEntry.dwSize = sizeof(ProcEntry);
bIsok = Process32First(pSnap, &ProcEntry);
while(bIsok)
{
StringGrid2->Cells[0][i]=ProcEntry.szExeFile;
StringGrid2->Cells[1][i]=ProcEntry.th32ProcessID;
StringGrid2->Cells[2][i]=ProcEntry.th32ParentProcessID;
StringGrid2->Cells[3][i]=ProcEntry.cntThreads;
StringGrid2->Cells[4][i]=ProcEntry.pcPriClassBase;
bIsok = Process32Next(pSnap, &ProcEntry);
i++;
StatusBar1->Panels->Items[0]->Text="Процессов: " + IntToStr(i);
StringGrid2->RowCount=i;
}
CloseHandle(pSnap);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender) {
n=1;
Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
n++;
ProgressBar1->Visible=true;
ProgressBar1->Position=n;
StatusBar1->Panels->Items[1]->Text="Идет отключение процесса..." ;
if (n==15) {
DWORD pid=StrToInt(StringGrid2->Cells[1][StringGrid2->Row]);
HANDLE hp;
hp = OpenProcess(PROCESS_ALL_ACCESS, true, pid);
if(TerminateProcess(hp,true))
StatusBar1->Panels->Items[1]->Text="Процесс отключен";
else
StatusBar1->Panels->Items[1]->Text="Процесс не удалось отключить";
Button1Click(Sender);
Button1Click(Sender);
Timer1->Enabled=false;
ListBox1->Clear();
ProgressBar1->Visible=false;
Button1Click(Sender);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
n=1;
Timer2->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid2Click(TObject *Sender)
{
ListBox1->Clear();
StatusBar1->Panels->Items[1]->Text="";
int i=0;
DWORD PID=StrToInt(StringGrid2->Cells[1][StringGrid2->Row]);
HANDLE pMdlSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PID);
bool bIsok = false;
MODULEENTRY32 MdlEntry;
MdlEntry.dwSize = sizeof(MODULEENTRY32);
bIsok = Module32First(pMdlSnap, &MdlEntry);
while(bIsok)
{
ListBox1->Items->Strings[i]=MdlEntry.szExePath;
bIsok = Module32Next(pMdlSnap, &MdlEntry);
i++;
}
CloseHandle(pMdlSnap);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
int ilMaxWidth = 0;
const int ilBorder = 12;
for ( int ilStringNo = 0; ilStringNo < ListBox1 -> Items-> Count; ++ilStringNo ) {
int ilWidth = ListBox1 -> Canvas ->TextWidth( ListBox1 -> Items -> Strings[ ilStringNo ] );
if ( ilWidth > ilMaxWidth )
ilMaxWidth = ilWidth;
}
SendMessage( ListBox1 -> Handle,LB_SETHORIZONTALEXTENT,ilMaxWidth + 2 * ilBorder, 0 );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
n++;
ProgressBar1->Visible=true;
ProgressBar1->Position=n;
StatusBar1->Panels->Items[1]->Text="Идет изменение приоритета процесса...";
if (n==15) {
DWORD pid=StrToInt(StringGrid2->Cells[1][StringGrid2->Row]);
HANDLE hProcess=OpenProcess(PROCESS_SET_INFORMATION,true,pid);
switch (TrackBar1->Position) {
case 0: pri=1;
break;
case 1: pri=2;
break;
case 2: ;
break;
case 3: pri=3;
break;
case 4: pri=4;
break;
}
if (pri==1) {
if (SetPriorityClass(hProcess, IDLE_PRIORITY_CLASS))
StatusBar1->Panels->Items[1]->Text="Приоритет изменен";
else
StatusBar1->Panels->Items[1]->Text="Приоритет остался прежним";
}
if (pri==2) {
if (SetPriorityClass(hProcess, NORMAL_PRIORITY_CLASS))
StatusBar1->Panels->Items[1]->Text="Приоритет изменен";
else
StatusBar1->Panels->Items[1]->Text="Приоритет остался прежним";
}
if (pri==3) {
if (SetPriorityClass(hProcess, HIGH_PRIORITY_CLASS))
StatusBar1->Panels->Items[1]->Text="Приоритет изменен";
else
StatusBar1->Panels->Items[1]->Text="Приоритет остался прежним";
}
if (pri==4) {
if (SetPriorityClass(hProcess,REALTIME_PRIORITY_CLASS))
StatusBar1->Panels->Items[1]->Text="Приоритет изменен";
else
StatusBar1->Panels->Items[1]->Text="Приоритет остался прежним";
}
TrackBar1->Position=2;
pri=0;
Button1Click(Sender);
Timer2->Enabled=false;
ProgressBar1->Visible=false;
}
}
Unit 1.h
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <Grids.hpp>
#include <XPMan.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:// IDE-managed Components
TStatusBar *StatusBar1;
TProgressBar *ProgressBar1;
TTrackBar *TrackBar1;
TListBox *ListBox1;
TButton *Button1;
TButton *Button2;
TLabel *Label1;
TLabel *Label2;
TLabel *Label3;
TLabel *Label4;
TLabel *Label5;
TXPManifest *XPManifest1;
TTimer *Timer1;
TStringGrid *StringGrid2;
TTimer *Timer2;
void __fastcall FormCreate(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Timer1Timer(TObject *Sender);
void __fastcall TrackBar1Change(TObject *Sender);
void __fastcall StringGrid2Click(TObject *Sender);
void __fastcall ListBox1Click(TObject *Sender);
void __fastcall Timer2Timer(TObject *Sender);
private:// User declarations
public:// User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Документ
Категория
Рефераты
Просмотров
38
Размер файла
173 Кб
Теги
лаб8
1/--страниц
Пожаловаться на содержимое документа