在结束进程的同时通知与其相关联的动态链接库,但是由于它的这种执行的强制性,使得
ExitProcess ( ) 函 数 在 使 用 上 将 存 在 有 安 全 隐 患 。 例 如 , 如 果 在 程 序 调 用
ExitProcess ( ) 函 数 之 前 曾 用 new 操 作 符 申 请 过 一 段 内 存 , 那 么 将 会 由 于
ExitProcess()函数的强制性而无法通过 delete 操作符将其释放,从而造成内存泄漏。
有鉴于 ExitProcess()函数的强制性和不安全性,在使用时一定要引起注意。
ExitProcess()只能强制执行本进程的退出,如果要在一个进程中强制结束其他的进
程 就 要 用 TerminateProcess ( ) 来 实 现 。 与 ExitProcess ( ) 不 同 ,
TerminateProcess()函数执行后,被终止的进程是不会得到任何关于程序退出的通知
的。也就是说,被终止的进程是无法在结束运行前进行退出前的收尾工作的。所以,通常
只有在其他任何方法都无法迫使进程退出时才会考虑使用 TerminateProcess()去强制
结束进程的。下面给出 TerminateProcess()的函数原型:
BOOL TerminateProcess(HANDLE hProcess, UINT uExitCode);
参数 hProcess 和 uExitCode 分别为进程句柄和退出代码。如果被结束的是本进程 ,
可以通过 GetCurrentProcess()获取到句柄。TerminateProcess()是异步执行的,
在 调 用 返 回 后 并 不 能 确 定 被 终 止 进 程 是 否 已 经 真 的 退 出 , 如 果 调 用
TerminateProcess()的进程对此细节关心,可以通过 WaitForSingleObject()来等
待进程的真正结束。
2.3 进程终止
一旦系统中出现要求终止进程的事件后,便调用进程终止原语。终止进程的主要操作过程
是:
1)从系统的 PCB 表中找到指定进程的 PCB。若它正处于运行态,则立即终止该进程的运
行。
2)回收该进程所占用的全部资源。
3)若该进程还有子孙进程,则还要终止其所有子孙进程,回收它们所占用的全部资源。
4)释放被终止进程的 PCB,并从原来队列中摘走。
2.4.进程阻塞
正在运行的进程因提出的服务请求未被操作系统立即满足,或者所需数据尚未到达等原因,
只能转变为阻塞态,等待相应事件出现后再把它唤醒。
正在运行的进程通过调用阻塞原语主动地把自己阻塞。进程阻塞的过程如下:
1)立即停止当前进程的执行;
2)将现行进程的 CPU 现场送到该进程的 PCB 现场保护区中保存起来,以便将来重新运行
时恢复此时的现场;