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

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

  • 相关阅读:
    msyql数据库位置
    linux端口
    crontab
    floyd算法 青云的机房组网方案(简单)
    拓扑排序 codevs 4040 cojs 438
    高精度模板
    莫比乌斯函数
    二分算法~~~大综合
    莫比乌斯反演 BZOJ 2820
    2016.6.2考试整理
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8450104.html
Copyright © 2020-2023  润新知