Windows内核之进程的终止和子进程

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 开辟子进程

         这样有点是既能够保护数据,能够同步运行,也能够等待新进程运行完成再去运行其它进程的代码。缺点是开辟新进程,会造成地址空间的浪费。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118576.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • spark web ui中的skipped的含义

    spark web ui中的skipped的含义顾名思义,跳出的意思啦。例如如图:skipped的stages代表是已经执行过了。所以不需要再执行了。如何,你有一个testRdd。然后先做testRdd.Filter("xxx&quo

    2022年8月5日
    4
  • linux内核 5.0,Linux Kernel 5.0 正式发布,FreeSync支持[通俗易懂]

    linux内核 5.0,Linux Kernel 5.0 正式发布,FreeSync支持[通俗易懂]LinusTorvalds已经取得了进展,刚刚发布了Linux5.0稳定内核,最初是作为Linux4.21内核周期提供主线AMDRadeonFreeSync支持,持续开发英特尔Icelake和其他新CPU功能,罗技高分辨率滚动功能,网络改进等等。在今天的LinuxKernel5.0版本中,创建者LinusTorvalds评论道,“LinuxKernel5.0发布的最后一周并不完…

    2022年5月30日
    39
  • pycharm 2021.5.3激活码[在线序列号][通俗易懂]

    pycharm 2021.5.3激活码[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    259
  • inputstream.read() 方法 乱码_InputStreamReader

    inputstream.read() 方法 乱码_InputStreamReadernewInputStreamReader(request.getInputStream(),“UTF-8”)引起了乱码,改为newInputStreamReader(newBufferedInputStream(request.getInputStream()))后解决了乱码问题针对这个乱码问题,在网上搜索后有以下3种情况[1]数据库表里面字符集设置错误[2]由于未加编码过滤器导致SpringMVC接收参数时造成的乱码[3]代码中涉及byte数组转换String时出现了问题一、解

    2022年9月26日
    5
  • ASP.NET MVC是如何运行的

    ASP.NET MVC是如何运行的ASP.NET由于采用了管道式设计,所以具有很好的扩展性,整个ASP.NETMVC应用框架就是通过扩展ASP.NET实现的。通过上面对ASP.NET管道设计的介绍我们知道,ASP.NET的扩展点主要体现在HttpModule和HttpHandler这两个核心组件之上,整个ASP.NETMVC框架就是通过自定义的HttpModule和HttpHandler建立起来的。为了使读者能够从整体上把握ASP.NETMVC框架的工作机制,接下来我们按照其原理通过一些自定义组件来模拟ASP.NETMVC的

    2022年7月22日
    10
  • github:pycharm 2021激活码【在线注册码/序列号/破解码】

    github:pycharm 2021激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号