Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

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

.cpp
Скачиваний:
16
Добавлен:
01.05.2014
Размер:
8.15 Кб
Скачать
#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;
		}
	}
}
Соседние файлы в предмете Операционные системы