• Chapter04进程终止



    一个进程终止的四种方式:

    • 基线程(primary thread)的入口函数自动返回.例如通常的main函数返回。
        在基线程的入口函数退出时必须确保:
        • 所有的该线程创建的C++对象都调用了对应的析构函数。
        • 操作系统已经释放了所有申请的线程堆栈。
        • 系统在入口函数的返回值中甚至了退出代码值(exit code)
        • 系统将减少进程内核对象(process kernel object)的引用值(usage count)

    • 在进程的一个线程中调用ExitProcess函数。

              如果进程正常地从基线程(primary thread)的入口函数退出,则会自动清理和释放

      资源。但是如果直接调用ExitProcess函数则就是直接地粗暴地退出进程。

      #include <windows.h>
      #include <stdio.h>
      class CSomeObj 
      {
      	public:
      		CSomeObj() { printf("Constructor\r\n"); }
      		~CSomeObj() { printf("Destructor\r\n"); }
      };
      
      CSomeObj g_GlobalObj;
      
      void main () 
      {
      	CSomeObj LocalObj;
      	ExitProcess(0); 
      	
      	// This shouldn't be here
      	// At the end of this function, the compiler automatically added
      	// the code necessary to call LocalObj's destructor.
      	// ExitProcess prevents it from executing.
      }
      /*
      调用ExitProcess的输出结果:
      	Constructor
      	Constructor
      	
      不调用ExitProcess的输出结果:
      	Constructor
      	Constructor
      	Destructor
      	Destructor
      */


    • 在其他进程的线程中调用TerminateProcess函数。
    BOOL TerminateProcess(HANDLE hProcess,UINT fuExitCode);
    TerminateProcess函数和ExitProcess函数的一个主要的不同点就是:TerminateProcess
    函数可以通过进程对应hProcess的句柄参数来终止任意进程,而ExitProcess函数只能终止
    调用该函数的进程。
    TerminateProcess函数函数是异步的,调用该函数只是通知系统该进程要退出,但并不能
    保证进程就能马上退出。

    • 该进程中的所有线程都死掉了。


    一个进程退出时,将会执行以下操作:
    • 进程中的所有线程都将终止。
    • 所有的用户对象和GDI都会被释放。都有的内核对象(Kernel Objects)都会被释放。
    • 函数的 exit code 从 STILL_ACTIVE 变成ExitProcess或TerminateProcess函数的返回值
    • 进程内核对象(process kernel object)的状态变成已触发状态。
    • 进程内核对象(process kernel object)的引用值减一。

    PS:
    当一个进程退出,就不存在“资源泄漏”得说法。因为进程退出时系统会清理所有的数据。
    但是当一个资源不需要就应该用代码将其释放,不然就有点“占着茅坑不拉屎”……


  • 相关阅读:
    thinkphp5日期时间查询比较和whereTime使用方法
    Bootstrap 标签
    MySQL 查询当天、周、月,最近一周、一月的数据,以及当年每月的统计数据
    把字符串解析到变量,数组变量中的函数 PHP parse_str() 函数
    PHP 数组转字符串,与字符串转数组
    php 获取最近一周,一个月,一年
    linux达人养成计划学习笔记(六)—— 挂载命令
    linux达人养成计划学习笔记(五)—— 关机和重启命令
    linux达人养成计划学习笔记(四)—— 压缩命令
    linux达人养成计划学习笔记(三)—— 帮助命令
  • 原文地址:https://www.cnblogs.com/java20130722/p/3207223.html
Copyright © 2020-2023  润新知