PoEdu - Windows阶段班 【Po学校】Lesson05 - 进程 -终止进程的正确方式 & 使用计数

- 4种状况下终止进程
- 1入口函数返回 (正常的线上方式)
- 入口函数在返回时,确保如下几件事情已经完成:
- a.主线程所建立的任何对象都已经被正确的销毁
- b.操做系统会正确的释放线程的堆栈
- c.将进程的取出代码设置成入口函数的返回值
- d.递减内核对象的使用计数
- 2本进程当中任意一个线程调用ExitProcess (非正常终止,强制结束进程,高风险)
- 不该调用此函数来结束进程,当函数被调用 的时候,会结束进程,并将代码设置为uExtiCode.但纯种并未正确对事,会致使纯种没法正确被清理。
- 3另一个进程中的线程远程调用TermitateProcess (非正常终止,高风险)
- 不该该用此函数来结束进程,此函数可以结束其余进程。异步函数。
- 4进程的全部线程都天然死亡,这种状况不多见,只在理论中存在。
- 使用计数
- 建立一个进程后,会随之打开了两个内核对象,一个进程,一个主线程;
- 先看“进程内核对象”的使用计数:CreateProcess函数实际上要设置进程内核对象的使用计数为2
- CreateProcess会把进程内核对象计数设置为1,在入口函数返回时,会把进程内核对象计数减1;此时进程内核对象计数为0,能够说是彻底消亡了。但这是理论上的逻辑,坑点在实际中:CreateProcess函数会在PROCESS_INFORMATION这个结构体中,使用第2次进程内核对象,由于这个结构体中,填充了进程内核句柄。
- 退出代码:入口函数在返回退出时,把进程内核对象的使用计数减1,由2次变1次,此时当前PROCESS_INFORMATION结构体会保留退出代码,以方便父进程取用。
- 正确的销毁一个进程,让系统回收之,须要关闭PROCESS_INFORMATION里面填充使用过的:HANDLE hProcess。
- CloseHandle(PROCESS_INFORATION.hProcess);的意义在于,把使用计数清零。
- 内核泄露只能经过重启操做系统来实现。因此其危害是严重的。
欢迎关注本站公众号,获取更多信息