Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Кафедра ЕОМ
Звіт
до лабораторної роботи № 1
з дисципліни: «Системне програмне забезпечення»
«Процеси та потоки»
Мета: Засвоїти поняття «процесів» та «потоків» як основних компонентів сучасних операційних систем. Здобути навики створення, керування та знищення «процесів» та «потоків» в операційній системі Windows.
Завдання: Розробити програму в середовищі Visual Studio, що демонструє використання системних викликів, відзначених символом “+”, відповідно до варіанту в таблиці 1.
/
Таблиця 1. Номера варіанту.
Код завдання:
int main() {
HANDLE hWindow = 0;
DWORD dword;
HWND hWnd_W;
DWORD ProcId;
DWORD clas;
PROCESS_INFORMATION pi;
FILE *myfilehandle;
int priority;
HANDLE hThread;
int choose = 4;
while (choose != 12) {
switch (choose = MenuSwitch()) {
case 1:
WinExec("notepad.exe", SW_RESTORE);
//ShellExecute(NULL, L"open", L"calc.exe", NULL, NULL, SW_RESTORE);
break;
case 2:
STARTUPINFO cif;
ZeroMemory(&cif, sizeof(STARTUPINFO));
if (CreateProcess(L"C:\\windows\\notepad.exe", NULL, NULL, NULL, FALSE, NULL, NULL, NULL, &cif, &pi) == TRUE)
{
cout << "Thread ID: " << pi.hThread << endl;
cout << "Process ID: " << pi.hProcess << endl;
Sleep(1000);
}
break;
case 3:
hWnd_W = FindWindow(NULL, L"Блокнот");
dword = GetWindowThreadProcessId(hWnd_W, &pi.dwProcessId);
hWindow = OpenProcess(PROCESS_ALL_ACCESS, false, pi.dwProcessId);
cout << "Finden process handle: " << hWindow << endl; break;
case 4:
CloseHandle(hWindow);
break;
case 5:
cout << "Process Id: " << GetCurrentProcessId() << endl;
break;
case 6:
cout << "Exit Code Process: " << GetExitCodeProcess(hWindow, 0) << endl;
break;
case 7:
clas = GetPriorityClass(hWindow);
switch (clas) {
case ABOVE_NORMAL_PRIORITY_CLASS:
cout << "Class: ABOVE_NORMAL_PRIORITY_CLASS"; break;
case BELOW_NORMAL_PRIORITY_CLASS:
cout << "Class: BELOW_NORMAL_PRIORITY_CLASS"; break;
case HIGH_PRIORITY_CLASS:
cout << "Class: HIGH_PRIORITY_CLASS"; break;
case IDLE_PRIORITY_CLASS:
cout << "Class: IDLE_PRIORITY_CLASS"; break;
case NORMAL_PRIORITY_CLASS:
cout << "Class: IDLE_PRIORITY_CLASS"; break;
case REALTIME_PRIORITY_CLASS:
cout << "Class: IDLE_PRIORITY_CLASS"; break;
}
break;
case 8:
unsigned threadID;
myfilehandle = fopen("Rez.txt", "w");
hThread = (HANDLE)_beginthreadex(NULL, 0, &PrintIntoFile, myfilehandle, 0, &threadID);
for (int i = 0; i < 10; i++) {
cout << "Potik 1...\n";
Sleep(150);
}
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
printf("Potik zaversheno..\n");
fclose(myfilehandle);
break;
case 9:
cout << "Exit COde Thread: " << GetExitCodeThread(hThread,0) << endl;
break;
case 10:
cout << "Using Suspend Thread..." << endl;
SuspendThread(hThread);
break;
case 11:
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
break;
case 12:
cout << "Using Resume Thread..." << endl;
ResumeThread(hThread);
break;
case 13:
system("CLS");
break;
}
}
return 0;
}
unsigned __stdcall PrintIntoFile(void* pArguments) {
FILE* Ptr = (FILE*)pArguments;
DWORD DoubleWord = GetCurrentProcessId();
char proc[100] = "Process ID: ";
for (int i = 0; i < 100; i++) {
if (proc[i] == NULL)
break;
fprintf(Ptr, "%c", proc[i]);
}
char procID[10];
sprintf(procID, "%d", DoubleWord);
for (int i = 0; i < 10; i++)
{
if (procID[i] == NULL)
break;
fprintf(Ptr, "%c", procID[i]);
}
fprintf(Ptr, "%c", '\n');
DoubleWord = GetCurrentThreadId();
strcpy(proc, "Thread ID: ");
for (int i = 0; i < 100; i++) {
if (proc[i] == NULL)
break;
Sleep(250);
printf("Potik 2...\n");
fprintf(Ptr, "%c", proc[i]);
}
char thrId[10];
sprintf(thrId, "%d", DoubleWord);
for (int i = 0; i < 10; i++) {
if (thrId[i] == NULL)
break;
fprintf(Ptr, "%c", thrId[i]);
}
time_t now = time(0);
tm* localtm = localtime(&now);
fprintf(Ptr, "%c", '\n');
fprintf(Ptr, "%s", asctime(localtm));
_endthreadex(0);
return 0;
}
Рис.1.Результат виконання.
Висновок: На цій лабораторній роботі я засвоїв поняття «процесів» та «потоків» як основних компонентів сучасних операційних систем. Здобув навики створення, керування та знищення «процесів» та «потоків» в операційній системі Windows.