《Windows核心编程系列》谈谈进程的建立和终止

发表于:2012-10-09 10:04

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:ithzhang    来源:51Testing软件测试网采编

  ExitProcess,ExitThread只能由本进程的其他线程调用。而TerminateProcess和TerminateThread却可以由任何其他进程的线程调用。它的第一个参数指定要终止进程的句柄。这种情况下应用程序得不到自己要被杀死的通知,也不能阻止自己被杀死,当然也无法为自己准备好后事(得不到清理)。例如已经修改的文件没有刷新到磁盘上。

  但要明白进程终止后属于它的任何东西都会被释放。TerminateProcess是异步的,此函数调用后我们并不能保证进程已经被强行终止了。要确定进程是否终止可以调用WaitForSingleObject函数,并传入进程句柄。

  进程终止时进行的操作。

  一个进程终止时,系统会依次执行以下操作:

  1:终止进程中遗留的任何线程。

  2:释放进程分配的所有用户对象,关闭所有内核对象。如果它们的使用计数变为0,内核对象将会释放。

  3:将进程的退出代码从STILL_ACTIVE变为传给ExitProcess或是TerminateProcess的参数存储在内核对象中。

  4:进程内核对象变为一触发状态。这也是为什么其他线程可以挂起他们自己直至另一个进程终止运行。

  5:进程内核对象的使用计数递减1。

  进程内核对象的生命期至少能像进程本身一样长。当进程终止时如果系统中还有另一个进程打开了这个进程的内核对象的句柄,进程内核对象的使用计数就不会变为0。当父进程忘记关闭子进程的句柄时往往发生这种情况。

  进程终止了内核对象还没有被释放,这样做有用吗?当然有用!!即使进程终止了,存储在内核对象的信息也有可能被使用,如我们想知道进程占用了多少Cpu时间,或是想获得它的退出代码。GetExitCodeProcess此函数会查找进程内核对象并从内核对象的数据结构中取出退出代码。任何时候都可以调用此函数。如此时进程正在运行那么将会得到STILL_ALIVE。

  WaitForSingleObject将会挂起当前线程,知道它所等待的对象变为已触发状态。进程或线程对象在终止时就会变成已触发状态。

相关链接:

《Windows核心编程系列》谈谈Windows钩子

《Windows核心编程系列》谈谈内核对象及句柄的本质

《Windows核心编程系列》谈谈基址重定位和模块绑定

《Windows核心编程系列》谈谈修改导入段拦截API

55/5<12345
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号