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

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

  • 相关阅读:
    PNG文件格式具体解释
    opencv2对读书笔记——使用均值漂移算法查找物体
    Jackson的Json转换
    Java实现 蓝桥杯VIP 算法训练 装箱问题
    Java实现 蓝桥杯VIP 算法训练 装箱问题
    Java实现 蓝桥杯VIP 算法训练 单词接龙
    Java实现 蓝桥杯VIP 算法训练 单词接龙
    Java实现 蓝桥杯VIP 算法训练 方格取数
    Java实现 蓝桥杯VIP 算法训练 方格取数
    Java实现 蓝桥杯VIP 算法训练 单词接龙
  • 原文地址:https://www.cnblogs.com/yxwkf/p/3924557.html
Copyright © 2020-2023  润新知