Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №6
.cpp#include <stdio.h>
#include <windows.h>
#include<tlhelp32.h>
#include <conio.h>
class process32list{
class Node{
public:
PROCESSENTRY32 d;
Node *next, *prev;
Node(PROCESSENTRY32 dat): d(dat), next(NULL), prev(NULL){}
};
Node *pbeg,*pend;
public:
process32list(): pbeg(NULL), pend(NULL){}
~process32list();
void add(PROCESSENTRY32 d);
void sort();
void display();
};
class thread32list{
class Node{
public:
THREADENTRY32 d;
Node *next, *prev;
Node(THREADENTRY32 dat): d(dat), next(NULL), prev(NULL){}
};
Node *pbeg,*pend;
public:
thread32list(): pbeg(NULL), pend(NULL){}
~thread32list();
void add(THREADENTRY32 d);
void sort();
void display();
};
void main(){
int choice = 0;
HANDLE snapshot = NULL;
DWORD flags = TH32CS_SNAPPROCESS|TH32CS_SNAPTHREAD;//processes and threads
DWORD processID = NULL;
BOOL first = FALSE;
BOOL next = FALSE;
process32list pList;
thread32list tList;
PROCESSENTRY32 process32;
DWORD ownerProcessID;
THREADENTRY32 thread32;
//snapshot
snapshot = CreateToolhelp32Snapshot(flags, processID);
if(snapshot==INVALID_HANDLE_VALUE){
printf("Error...");
getch();
exit(0);
};
//end of snapshot
do{
system("cls");
printf("1. View Processes List\n");
printf("2. View Threads List For Specified Process\n");
printf("3. Exit\n");
printf(" Make A Selection: ");
scanf("%d",&choice);
switch(choice){
case 1: process32.dwSize = sizeof(PROCESSENTRY32);
first = Process32First(snapshot, &process32);
if(first){
pList.add(process32);
next = Process32Next(snapshot, &process32);
while(next){
pList.add(process32);
next = Process32Next(snapshot, &process32);
}
if(GetLastError()!=ERROR_NO_MORE_FILES){
printf("Error...\n");
}
} //if(first)
else
if(!first){
printf("\nError...");
}
pList.sort();
system("cls");
pList.display();
getch();
pList.~process32list();
break;
case 2: printf("Input Process ID: ");
scanf("%lu",&ownerProcessID);
thread32.dwSize = sizeof(THREADENTRY32);
first = Thread32First(snapshot, &thread32);
if(first){
if(thread32.th32OwnerProcessID == ownerProcessID){
tList.add(thread32);
}
next = Thread32Next(snapshot, &thread32);
while(next){
if(thread32.th32OwnerProcessID == ownerProcessID){
tList.add(thread32);
}
next = Thread32Next(snapshot, &thread32);
}
if(GetLastError()!=ERROR_NO_MORE_FILES){
printf("Error...\n");
}
} //if(first)
else
if(!first){
printf("\nError...");
}
tList.sort();
system("cls");
tList.display();
getch();
tList.~thread32list();
break;
case 3: CloseHandle(snapshot);
break;
}
}while(choice!=3);
}
//==========================================================================================
void process32list::add(PROCESSENTRY32 d){
Node *p = new Node(d);
if(!pbeg) pbeg = pend = p;
else{
p->prev = pend;
pend->next = p;
pend = p;
}
}
//------------------------------------------------------------------------------------------
void process32list::display(){
Node *p = pbeg;
//header
printf("===============================================================================\n");
printf("| PROCESSES LIST |\n");
printf("===============================================================================\n");
printf("| Process ID | Threads N | Base Priority | Usage | EXE File |\n");
printf("-------------------------------------------------------------------------------\n");
//end of header
while(p){
printf("| %-10lu |",p->d.th32ProcessID);
printf(" %-9lu |",p->d.cntThreads);
printf(" %-13lu |",p->d.pcPriClassBase);
printf(" %-5lu |",p->d.cntUsage);
printf(" %-26s |\n",p->d.szExeFile);
p = p->next;
}
printf("===============================================================================\n");
}
//------------------------------------------------------------------------------------------
void process32list::sort(){
Node *idmax;
Node *p;
Node *a;
idmax = pbeg;
while(idmax->next){
p = idmax->next;
while(p){
if(p->d.cntThreads<idmax->d.cntThreads){//change nodes
if(idmax->next==p){
if(p!=pend){
p->next->prev = idmax;
}
if(idmax!=pbeg){
idmax->prev->next = p;
}
p->prev = idmax->prev;
idmax->prev = p;
idmax->next = p->next;
p->next = idmax;
}//if(idmax->next==p)
else{
if(p!=pend){
p->next->prev = idmax;
}
idmax->next->prev = p;
if(idmax!=pbeg){
idmax->prev->next = p;
}
p->prev->next = idmax;
a = p->prev;
p->prev = idmax->prev;
idmax->prev = a;
a = p->next;
p->next = idmax->next;
idmax->next = a;
}//else
if(idmax==pbeg) pbeg = p;
if(p==pend) pend = idmax;
idmax = p;
}//(p->d.cntThreads>idmax->d.cntThreads)
p = p->next;
}//while(p)
idmax = idmax->next;
}//while(idmax)
}
//------------------------------------------------------------------------------------------
process32list::~process32list(){
if(pbeg){
Node *p = pbeg;
while(p){
p = p->next;
delete pbeg;
pbeg = p;
}
}
}
//==========================================================================================
void thread32list::add(THREADENTRY32 d){
Node *p = new Node(d);
if(!pbeg) pbeg = pend = p;
else{
p->prev = pend;
pend->next = p;
pend = p;
}
}
//------------------------------------------------------------------------------------------
void thread32list::display(){
Node *p = pbeg;
//header
printf("===============================================================================\n");
printf("| THREADS LIST FOR PROCESS %-26lu|\n",p->d.th32OwnerProcessID);
printf("===============================================================================\n");
printf("| Thread ID | Usage | Delta Priority | Base Priority |\n");
printf("-------------------------------------------------------------------------------\n");
//end of header
while(p){
printf("| %-15lu |",p->d.th32ThreadID);
printf(" %-15lu |",p->d.cntUsage);
printf(" %-18ld |",p->d.tpDeltaPri);
printf(" %-18lu |\n",p->d.tpBasePri);
p = p->next;
}
printf("===============================================================================\n");
}
//------------------------------------------------------------------------------------------
void thread32list::sort(){
Node *idmax;
Node *p;
Node *a;
idmax = pbeg;
while(idmax->next){
p = idmax->next;
while(p){
if(p->d.th32ThreadID<idmax->d.th32ThreadID){//change nodes
if(idmax->next==p){
if(p!=pend){
p->next->prev = idmax;
}
if(idmax!=pbeg){
idmax->prev->next = p;
}
p->prev = idmax->prev;
idmax->prev = p;
idmax->next = p->next;
p->next = idmax;
}//if(idmax->next==p)
else{
if(p!=pend){
p->next->prev = idmax;
}
idmax->next->prev = p;
if(idmax!=pbeg){
idmax->prev->next = p;
}
p->prev->next = idmax;
a = p->prev;
p->prev = idmax->prev;
idmax->prev = a;
a = p->next;
p->next = idmax->next;
idmax->next = a;
}//else
if(idmax==pbeg) pbeg = p;
if(p==pend) pend = idmax;
idmax = p;
}//if(p->d.th32ThreadID>idmax->d.th32ThreadID)
p = p->next;
}//while(p)
idmax = idmax->next;
}//while(idmax)
}
//------------------------------------------------------------------------------------------
thread32list::~thread32list(){
if(pbeg){
Node *p = pbeg;
while(p){
p = p->next;
delete pbeg;
pbeg = p;
}
}
}
Соседние файлы в предмете Операционные системы