К Т П           План занятия                                                              1                                           Страницы  | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 |

5. Завершение процессов

Процесс может завершить свою работу вызовом функции ExitProcess, которая имеет следующий прототип:
VOID ExitProcess(
  UINT uExitCode // код возврата из процесса
) ;

При вызове функции ExitProcess завершаются все потоки процесса с кодом возврата, который является параметром этой функции. При выполнении этой функции система посылает динамическим библиотекам, которые загружены процессом, сообщение dll_process_detach, которое говорит о том, что динамическую библиотеку необходимо отсоединить от процесса.
В листинге 4.5 приведен пример программы, которая завершает свою работу вызовом функции ExitProcess.

Листинг 4.5. Завершение процесса функцией ExitProcess

#include <windows.h>
  #include <iostream.h>

volatile UINT count;

void thread()
{
for (;;)
{
count++;
Sleep(100);
}
}

int main()
{
char c;
HANDLE hThread;
DWORD IDThread;

hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread, NULL,
0, &IDThread);
if (hThread == NULL)
return GetLastError();

for (;;)
{
cout << "Input 'y' to display the count or any char to exit: ";
cin >> (char)c;
if (c == 'y')
cout << "count = " << count << endl;
else
ExitProcess(1);
  }
}

Один процесс может быть завершен другим при помоши вызова функции TerminateProcess, которая имеет следующий прототип:
BOOL TerminateProcess(
  HANDLE hProcess, // дескриптор процесса
  UINT uExitCode // код возврата
) ;

Если функция TerminateProcess выполнилась успешно, то она возвращает ненулевое значение. В противном случае возвращаемое значение равно false. Функция TerminateProcess завершает работу процесса, но не освобождает все ресурсы, принадлежащие этому процессу. Это происходит потому, что при выполнении этой функции система не посылает динамическим библиотекам, загруженным процессом, сообщение о том, что библиотеку необходимо отсоединить от процесса. Поэтому эта функция должна вызываться только в аварийных ситуациях при зависании процесса.


Предыдущая        В начало страницы       Следующая
5