МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Кафедра ЕОМ
Звіт
до лабораторної роботи № 1
з дисципліни
" Системне програмування "
Мета: Засвоїти поняття «процесів» та «потоків» як основних компонентів сучасних операційних систем. Здобути навики створення, керування та знищення «процесів» та «потоків» в операційній системі Windows.
Варіант 2
Розробити програму в середовищі Visual Studio, що демонструє використання системних викликів, відзначених символом “+”, відповідно до варіанту.
Написати функцію потоку, яка як вхідний параметр приймає дескриптор відкритого текстового файлу. Функція повинна здійснювати посимвольне виведення у файл номер процесу, номер потоку та системний час. Передбачити достатню кількість ітерації запису в файл з одної функції потоку. Відкриття файлу слід виконувати до створення потоку, використовуючи функцію FileOpen(), а після завершення роботи з файлом слід викликати функцію FileClose().
Продемонструвати паралельне виконання створеного потоку з первинним потоком процесу.
#include<Windows.h>
#include<process.h>
#include<iostream>
usingnamespace std;
unsigned__stdcall ThreadFunc(void* );
staticunsigned_stdcallFileOut(void * File);
void ProcessAndThred();
int main()
{
ProcessAndThred();
HANDLE hFile;
TCHAR stdPath[30] = TEXT("D:\\test.txt");
hFile = CreateFile(stdPath,GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,OPEN_ALWAYS,0,0);
unsigned ThreadId;
HANDLE h_thread;
h_thread = (HANDLE) _beginthreadex (NULL,0,FileOut,hFile, 0, &ThreadId);
DWORD WrittenBytes;
for(int i=0;i!=10;i++)
{
WriteFile(hFile,"&",3,&WrittenBytes,0);
Sleep(100);
}
if(h_thread==INVALID_HANDLE_VALUE)
cout<<"Create a new thread is failed";
else
cout<<"Create a new thread is OK","OK";
CloseHandle(hFile);
TerminateThread(h_thread,0);
return 0;
}
unsigned__stdcallThreadFunc(void* arg)
{
_endthreadex(0);
return 0 ;
}
staticunsigned_stdcallFileOut(void * File)
{
HANDLE hFile = File;
char buff[100];
unsignedint ProcessId = GetCurrentProcessId();
unsignedint ThreadId = GetCurrentThreadId();
SYSTEMTIME SysTime;
GetSystemTime(&SysTime);
sprintf(buff,"ProcessId - %d\r\nThreadId - %d\r\nSystemTime - %d : %d : %d\r\n",
ProcessId,ThreadId,SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
int size=sizeof(buff);
DWORD WrittenBytes;
for(int i=0;buff[i]!=0;i++)
{
WriteFile(hFile,&buff[i],1,&WrittenBytes,0);
}
return 0;
}
void ProcessAndThred()
{
bool SetClass;
unsigned ThreadId; // ідентифікатор потоку
HANDLE hThread; // дескриптор потоку
int i = 0; // передаване число
DWORD SetPriority;
HANDLE hProc = NULL;
STARTUPINFO cif;
ZeroMemory(&cif,sizeof(STARTUPINFO));
PROCESS_INFORMATION pi;
// ShellExecute
HINSTANCE hInst = ShellExecuteW(NULL,
L"open", // Operation to perform
L"c:\\windows\\regedit.exe", // Application name
NULL, // Additional parameters
NULL, // Default directory
SW_SHOW);
if(reinterpret_cast<int>(hInst) > 32)
cout<<"ShellExecute Start Sucess"<<endl;
else
cout<<"ShellExecute don`t Start Sucess"<<endl;
// CreateProcess
if (CreateProcess(L"c:\\windows\\notepad.exe",NULL,
NULL,NULL,FALSE,NULL,NULL,NULL ,&cif,&pi)==TRUE)
cout<<"Create Process Start Sucess"<<endl;
else
cout<<"Erorr Create Process"<<endl;
//OpenProcess
hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pi.dwProcessId);
if(hProc==INVALID_HANDLE_VALUE)
cout<<"Open Process is failed"<<endl;
else
cout<<"Open Process is OK"<<endl;
// SetPriorityClass
SetPriority = SetPriorityClass(hProc,NORMAL_PRIORITY_CLASS);
cout<<" Priority Class is "<<SetPriority<<endl;
//GetExitCodeProcess
DWORD ExitCode1 = 0;
GetExitCodeProcess(hProc, &ExitCode1);
if(ExitCode1 == STILL_ACTIVE)
cout<<"Process is alive"<<endl;
else
cout<<"Process is dead"<<endl;
//begintjreadex
hThread =(HANDLE)_beginthreadex(NULL, 0,&ThreadFunc, &i,0,&ThreadId);
if(hThread==INVALID_HANDLE_VALUE)
cout<<"_beginthread is failed"<<endl;
else
cout<<"_beginthread is OK"<<endl;
//GetExitCodeThred
DWORD ExitCode = 0;
GetExitCodeThread (hThread, &ExitCode);
if((ExitCode == STILL_ACTIVE))
cout<<"Thered is alive"<<endl;
else
cout<<"Thread is dead"<<endl;
//GetThreadPriority
int get = GetThreadPriority (hThread);
cout<<endl<<"Thread priorety is "<<get<<endl;
//SetThreadPriority
SetClass = SetThreadPriority(hThread,THREAD_PRIORITY_LOWEST);
if(SetClass)
cout<<"Thread Priorety is change ok"<<endl;
else
cout<<"Can`t change Thread Priorety "<<endl;
//TerminateProcess
if(TerminateProcess(pi.hProcess,NO_ERROR))
cout<<"TerminateProcess is OK"<<endl;
else
cout<<"TerminateProcess is failed"<<endl;
//CloseHandle
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
Результат виконання
/
Рис.1
/
Рис.2(текстовий файл)
Висновок:Засвоїв поняття «процесів» та «потоків» як основних компонентів сучасних операційних систем. Здобув навики створення, керування та знищення «процесів» та «потоків» в операційній системі Windows.