Windows内核之进程的终止和子进程
1 进程终止的方法:
<1>主线程的进入点函数返回(最好使用这种方法)
<2>进程中的一个线程调用ExitProcesss函数(应该避免使用这样的方法)。
<3>还有一个进程中的线程调用TerminateProcess函数(应该避免使用这样的方法)。
<4>进程中的全部线程自行终止执行(这样的情况差点儿从未发生)。
1.1 主线程进入点函数返回
始终都应该这样来设计应用程序,即仅仅有当主线程的进入点函数返回时,它的进程才终止执行。这是保证全部线程资源可以得到正确清除的唯一办法。
<1> C++对象将可以使用它们的析构函数得以释放
<2> 操作系统可以正确的释放该线程使用的堆栈内存
<3> 系统将进程的退出代码设置为进入点函数的返回值
<4> 系统将内核对象的计数值减去1
1.2 调用ExitProcess函数
voidExitProcess(uExitCode)
跟主线程的进入点函数返回相比,它就不那么安全,不能保证资源被清理。
通过调用ExitProcess函数,C++/C执行期启动代码可以确保主线程从它的进入点函数返回时,进程便终止执行,而无论进程中是否还有其它线程在执行。
假设在进入点函数中调用ExitThread,那么主线程就会停止执行,可是假设进程中假设还有其它线程的话,进程便不会终止。
ExitProcess以及ExitThread能保证操作系统资源在函数调用时被清除,可是不能保证C/C++执行时资源被正确的清除,所以不妨不要调用这些资源。
在前面也介绍过当主线程的进入点函数返回的时候,C/C++执行时会调用执行时的exit函数,exit函数会完毕以下操作
<1>调用_onexit函数的调用而注冊的人不论什么函数
<2>为全部的全局和静态的C++对象调用析构函数
<3>调用系统的ExitProcess函数,将nMainRetVal传递给它。使得操作系统可以撤销进程并设置它的exit代码。
1.3 调用TerminateProcess 函数
BOOL TerminateProcess(HANDLE hProcess,UINTnExitCode)
这个函数通知进程内全部线程终止,当全部线程终止时,进程也会终止了,可是它不会告诉进程内相关联的DLL这个进程将要被终止。它做的事情:
<1>全部打开的句柄被关闭
<2>全部的线程会被终止
<3>进程对象的状态变为终止的,满足全部等待进程结束的线程
<4>进程中全部线程对象的状态变为终止,满足全部等待线程结束的线程
<5>进程的终止状态由STILL_ACTIVE变为了进程的返回代码
这个函数是异步的,它告诉操作系统,你要终止某个进程,可是当函数返回的时候,你无法保证进程是否已经被杀死,假设想要确切知道进程是否被杀死,能够使用WaitForSingleObject函数。
2 进程终止时的情况
<1>进程中全部剩余线程将被终止
<2>进程中指定的用户对象,GDI对象被释放,内核对象被关闭
<3>内核对象的状态编程收到通知的状态
<4>进程的退出代码由STILL_ACTIVE 变为ExitProcess或者TerminateProcess传递的的退出代码
<5>进程内核对象计数减去1
能够通过函数 BOOLGetExitCodeProcess(HANDLE handle,LPDWORD lpExitCode)来查找进程的退出代码,假设代码是STILL_ACTIVE表示的是进程还没终止,假设不是这个,就说明进程已经被终止。
3 子进程
程序中要实现一段功能一共同拥有3种方法:
<1>调用函数
<2>开辟新线程
<3>开辟新进程
3.1 调用函数
调用函数时很常见的,可是它的缺点是由于在同一个线程中,所以必须等待此函数运行完成,才干运行后面的代码
3.2 开辟新线程
这样可以在新线程运行的时候,同一时候运行其它线程的代码,可是这种缺点是不同线程之间须要交流数据时候,会产生同步的问题。
3.3 开辟子进程
这样有点是既能够保护数据,能够同步运行,也能够等待新进程运行完成再去运行其它进程的代码。缺点是开辟新进程,会造成地址空间的浪费。
Windows内核之进程的终止和子进程的更多相关文章
- Windows内核之进程基本含义以及进程的创建
进程 1 进程的含义: 1.1 一个是操作系统用来管理进程的内核对象. 内核对象也是系统用来存放关于进程的统计信息的地方. 1.2 还有一个是地址空间,它包括全部可运行模块或DL L 模块的代 ...
- Fibratus:一款功能强大的Windows内核漏洞利用和跟踪工具
今天给大家介绍的是一款名叫Fibratus的开源工具,广大研究人员可以使用这款功能强大的工具来进行Windows内核漏洞利用.挖掘与跟踪. Fibratus这款工具能够捕捉到绝大多数的Windows内 ...
- [5]windows内核情景分析---进程线程
本篇主要讲述进程的启动过程.线程的调度与切换.进程挂靠 进程的启动过程: BOOL CreateProcess ( LPCTSTR lpApplicationName, ...
- [编程] C语言Linux系统编程-等待终止的子进程(僵死进程)
1.等待终止的子进程(僵死进程): 如果一个子进程在父进程之前结束,内核会把子进程设置为一个特殊的状态,处于这种状态的进程称为僵死进程 当父进程获取了子进程的信息后,子进程才会消失. pid_t wa ...
- Windows下父进程监视子进程状态
最近研究自动化测试,需要获取程序的运行状态及结果,下面是些参考资料. 原文地址:http://blog.csdn.net/ariesjzj/article/details/7226443 Linux下 ...
- Windows 无法启动MongoDB服务 错误1067:进程意外终止
1:Windows 无法启动MongoDB服务 错误1067:进程意外终止 2:解决方法: 进入MongoDB安装目录\data\将此文件夹下的mongod.lock删除(网友提供解决方案,实验之后貌 ...
- Windows(7)上不能启动MySQL服务(位于本地计算机上)错误1067 :进程意外终止
就这段时间,很多人在抱怨为什么自己的MySQL又打不开问题. 就“Windows(7)上不能启动MySQL服务(位于本地计算机上)错误1067 :进程意外终止”这个问题,我想到了几种方案解决: 一.首 ...
- mysql 在windows server下发生系统错误 1067, 进程意外终止的解决方法
mysql 在windows server下发生系统错误 1067, 进程意外终止,请检查系统盘下的windows目录下是否存在mysql的配置文件my.ini,如存在,将其删除或改名即可.
- windows内核代码之进程操作
[toc] 一丶简介 整理一下windows内核中.常用的代码.这里只整理下进程的相关代码. 二丶 windows内核之遍历进程 内核中记录进程的结构体是EPROCESS结构.所以只需要遍历这个结构即 ...
随机推荐
- 转:Javascript异步编程的4种方法
你可能知道,Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排 ...
- CC++初学者编程教程(9) Windows8.1安装VS2013并捆绑QT与编程助手
我们在Windows8.1安装VS2013并捆绑QT与编程助手需要下列文件. 2. 在虚拟机中开启Windows8.1 3.然后选择VS2013的安装镜像. 4.将镜像复制到虚拟机. 5.我们装载这个 ...
- jQuery粘性跟随滚动条滚动的导航栏源代码下载
jQuery粘性跟随滚动条滚动的导航栏源代码下载 作者:网页模板 大小:0.005MB 点击次数:3494 发布时间:2014-03-07 12:55 分享到:0 特效介绍 jQuery粘性跟随滚动条 ...
- linux下安装配置svn独立服务器
subversion(以下简称svn)是近年来崛起的版本管理工具,是cvs的接班人. svn服务器有2种运行方式:独立服务器和借助apache.2种方式各有利弊. file:/// 直接版本库访问(本 ...
- Floyd算法应用-医院选址问题
1)问题描述 n个村庄之间的交通图可以用有向网图来表示,图中边<vi, vj>上的权值表示从村庄i到村庄j的道路长度.现在要从这n个村庄中选择一个村庄新建一所医院,问这所医院应建在哪个村庄 ...
- [置顶] 通过实例学习Struts2 (1)
前言 一直用Struts1 , 现在新的项目要转向Struts2了, 先研究学习一下,做点技术储备. 我一直认为计算机软件行业是一个实践性非常强的行业,书读了多少都不管用, 一定要卷起袖子,亲自动手, ...
- 网易云课堂_程序设计入门-C语言_第五周:函数_2完数
2 完数(5分) 题目内容: 一个正整数的因子是所有可以整除它的正整数.而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数.例如6=1+2+3(6的因子是1,2,3). 现在,你要写一个程序, ...
- UVALive 3635 Pie 切糕大师 二分
题意:为每个小伙伴切糕,要求每个小盆友(包括你自己)分得的pie一样大,但是每个人只能分得一份pie,不能拿两份凑一起的. 做法:二分查找切糕的大小,然后看看分出来的个数有没有大于小盆友们的个数,它又 ...
- NET 人民币大写
/***** HongShijin** Me@HongShijin.com** 2009-3-15 10:13:00.00000** text/C#***/ /// <summary> / ...
- 关于Oracle备份中的fractured block
One danger in making online backups is the possibility of inconsistent data within a block. For exam ...