Terminating a Process

当时想好是一周多点时间更新一篇blog,结果上周末跟同事去黄山旅游了。。果断湿身了。。。好了。。还是进入正题吧。

这次我想分享下关于如果去终止一个进程。这个之前省略一千字关于进程的概念之类的东西。如果下次有时间可以重新回头来梳理下。一般来说,终止一个进程总结一下有以下几种。让我们边总结边说明。

一,主线程的入口方法返回

其实这种情况的进程终止是我们大家都想看到的,因为从设计角度来说这个情况是比较理想的。这个也是唯一的办法能保证我们之前所占用的资源全部被释放了。当然在主线程返回之前我们应该需要做一些事情。比如:1,任何被这个主线程所创建出来的C++的对象我们都必须调用它们的析构函数去释放他们。2,对于系统来说,需要释放被线程栈所占用的内存。3,系统会为这个进程设置退出码(exit code)给你的主线程的返回值。4,系统会将所以被创建的kernel对象计数重置。

二,当一个线程调用ExitProcess方法去终止进程

以下是这个方法的签名:

 
     
VOID ExitProcess(
__in UINT uExitCode
);
那么这里会有一个小问题,就是为什么这个方法它的返回类型是一个VOID,可能大家知道,我这里就多啰嗦一句,因为这个方法的调用造成进程的终止,所以它后面的一切代码它都调用不到,所以自然也不需要一个返回值了。那么当我们主线程返回的时候,就像我们刚才所说的,它会把C/C++运行时所占用的资源全部释放,然后调用ExitProcess方法。例如我们举一段很简单的代码作为例子。
 
     
class MyClass
{
public :
MyClass(){printf(
" Constructor\r\n " );}
~ MyClass(){printf( " Destructor\r\n " );}
};

int _tmain( int argc, _TCHAR * argv[])
{
MyClass c2;
ExitProcess(
0 );

return 0 ;
}

我们会发现有了ExitProcess(0);这行代码,我们输出完Constructor后就终止了进程。而注释掉这行后,我们在经过return 0;后,它把析构函数的语句也一起打印了出来。这个就很好的证明了我之前说的那点。

三,其他进程的线程调用TerminateProcess方法终止了本进程

我们能够想象这个方法它必定会传入一个进程的HANDLE。以下是这个函数的签名:

 
     
BOOL TerminateProcess(
__in HANDLE hProcess,
__in UINT uExitCode
);

所以任何线程去调用这个方法都会把那个进程给终止掉。那么这种强制性的操作让被终止的进程没有来得及去释放自己的本身所占用资源的空间。那会不会造成内存泄漏呢?其实,操作系统会做这样的一系列工作,也就是所占用的资源会被释放,所打开的文件会被关闭,所有的kernel对象会不会计数重置,所有的GDI对象都会被摧毁。

下面我们来简单的总结下,当一个进程终止的时候,其实做了这样一些行为:

1. 这个进程中的任何一条线程都被终止。

2. 所占用的资源会被释放,所打开的文件会被关闭,所有的kernel对象会不会计数重置,所有的GDI对象都会被摧毁。当然这里面提到的kernel对象有个特点,只有当没有其他进程占用这样一个kernel对象资源的时候才会被计数重置。

3. 进程的退出码(exit code)从STILL_ALIVE变成了我们自定义传给ExitProcess或者TerminateProcess方法的参数值。

4. 当然里面还有一点就是kernel对象的状态被设置为有信号。这个就是为什么其他线程可以被挂起直到这个进程被终止。当然这个关于信号的概念,又可以说很多拉~下次有时间就写一篇哦~嘿嘿~

5. 进程中的kernel对象的计数被减为1。

好了就说那么多,如果大家觉得还有什么方法可以让一个进程终止的话也可以继续跟贴。Thank you for your time.

======我=======是=========结=========束==========线=======

posted on 2011-06-09 21:40 Esters 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/Esters/archive/2011/06/09/Terminating_a_Process.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值