windows核心开发之进程(二)
原创
©著作权归作者所有:来自51CTO博客作者dking94的原创作品,请联系作者获取转载授权,否则将追究法律责任
进程的终止
如果想要终止进程的运行,有下面四种方法:
(1)进程的主线程的入口函数正常返回。(最安全的、正常的退出方法);
(2)本进程内的人一个线程调用ExitProcess函数。(不推荐);
(3)另一个进程的线程调用TerminateProcess函数。(不推荐);
(4)进程中的所有线程自行终止。(很少出现)。
先来看看进程正常终止时会发生什么:
(1)进程中的所有剩余线程全部终止;
(2)所有由此进程创建、或打开的内核对象句柄就会关闭(如果内核对象没有被别的进程打开,系统会将内核对象撤销,如果有,不会被撤销,引用计数将减1),所有用户对象、GUI对象均被释放;
(3)进程内核对象变成受信状态;
(4)系统将进程内核对象的退出码值由STILL_ACTIVE改为指定的退出码;
(5)进程内核对象使用计数减1;
推荐的是用第一种方法终止进程,也就是让进程的主线程正常返回,因为这样才能保证对进程所引用的所有资源正确释放。
进程的主线程返回时,系统将有下面的动作:
(1)调用该线程创建的所有对象的析构函数,撤销对象释放资源;
(2)操作系统释放线程的堆栈内存;
(3)系统将进程的退出码设为线程的返回值;
(4)系统将进程内核对象的使用计数减1。
所以,如果进程非正常退出,将不能保证资源的正常释放。最典型的例子,我们可以在先定义一个类,类的析构函数可以打印一句“deconstrutor is called,”,然后main函数中定义一个该类的实例对象,接下来不让主函数正常返回,而调用ExitProcess函数,你会发现该对象的析构函数 并没有被调用。
下一篇:人生十二个经典领悟
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
linux网络之守护进程
linux关于tcp套接字通信,以及将服务端守护进程化。
服务器 子进程 守护进程 TCP套接字通信 线程池 -
Windows核心编程笔记之进程
改变进程基址,获取进程基址#include ...
#include 系统版本 错误信息 -
线程操作与进程挂起(Windows核心编程)
0x01 线程挂起与切换对于挂起进程,挂起线...
#include d3 主线程 -
linux进程(二)之基础
1. 操作系统最核心的概念就是进程,进程是操作系统资源管理的最小单位。进程是一个动态的实
#include 子进程 守护进程