zoukankan      html  css  js  c++  java
  • 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:
    当一个进程退出,就不存在“资源泄漏”得说法。因为进程退出时系统会清理所有的数据。
    但是当一个资源不需要就应该用代码将其释放,不然就有点“占着茅坑不拉屎”……


  • 相关阅读:
    Sql Server 2008卸载后再次安装一直报错
    listbox 报错 Cannot have multiple items selected when the SelectionMode is Single.
    Sql Server 2008修改Sa密码
    学习正则表达式
    Sql Server 查询第30条数据到第40条记录数
    Sql Server 复制表
    Sql 常见面试题
    Sql Server 简单查询 异步服务器更新语句
    jQuery stop()用法以及案例展示
    CSS3打造不断旋转的CD封面
  • 原文地址:https://www.cnblogs.com/java20130722/p/3207223.html
Copyright © 2011-2022 走看看