当时想好是一周多点时间更新一篇blog,结果上周末跟同事去黄山旅游了。。果断湿身了。。。好了。。还是进入正题吧。
这次我想分享下关于如果去终止一个进程。这个之前省略一千字关于进程的概念之类的东西。如果下次有时间可以重新回头来梳理下。一般来说,终止一个进程总结一下有以下几种。让我们边总结边说明。
一,主线程的入口方法返回
其实这种情况的进程终止是我们大家都想看到的,因为从设计角度来说这个情况是比较理想的。这个也是唯一的办法能保证我们之前所占用的资源全部被释放了。当然在主线程返回之前我们应该需要做一些事情。比如:1,任何被这个主线程所创建出来的C++的对象我们都必须调用它们的析构函数去释放他们。2,对于系统来说,需要释放被线程栈所占用的内存。3,系统会为这个进程设置退出码(exit code)给你的主线程的返回值。4,系统会将所以被创建的kernel对象计数重置。
二,当一个线程调用ExitProcess方法去终止进程
以下是这个方法的签名:
VOID ExitProcess(
__in UINT uExitCode
);
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.
======我=======是=========结=========束==========线=======