Chapter04-进程终止

本文介绍了进程终止的四种常见方式:主线程入口函数自动返回、调用ExitProcess函数、调用TerminateProcess函数及进程所有线程死亡。对比了ExitProcess与TerminateProcess函数的区别,并通过示例代码展示了直接调用ExitProcess函数导致资源未正常释放的情况。


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

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


[INFO] Scanning for projects... [INFO] [INFO] -----------------------< com.itheima:chapter01 >------------------------ [INFO] Building chapter01 1.0-SNAPSHOT [INFO] from pom.xml [INFO] --------------------------------[ war ]--------------------------------- [INFO] [INFO] >>> tomcat7:2.2:run (default-cli) > process-classes @ chapter01 >>> [INFO] [INFO] --- resources:3.3.1:resources (default-resources) @ chapter01 --- [INFO] Copying 3 resources from src\main\resources to target\classes [INFO] [INFO] --- compiler:3.11.0:compile (default-compile) @ chapter01 --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] <<< tomcat7:2.2:run (default-cli) < process-classes @ chapter01 <<< [INFO] [INFO] [INFO] --- tomcat7:2.2:run (default-cli) @ chapter01 --- [INFO] Running war on http://localhost:8080/chapter01 [INFO] Using existing Tomcat server configuration at D:\JAVA JDK22\pro2\chapter01\target\tomcat [INFO] create webapp with contextPath: /chapter01 11月 10, 2025 9:33:19 下午 org.apache.coyote.AbstractProtocol init 信息: Initializing ProtocolHandler ["http-bio-8080"] 11月 10, 2025 9:33:19 下午 org.apache.catalina.core.StandardService startInternal 信息: Starting service Tomcat 11月 10, 2025 9:33:19 下午 org.apache.catalina.core.StandardEngine startInternal 信息: Starting Servlet Engine: Apache Tomcat/7.0.47 11月 10, 2025 9:33:20 下午 org.apache.catalina.core.ApplicationContext log 信息: No Spring WebApplicationInitializer types detected on classpath 11月 10, 2025 9:33:20 下午 org.apache.coyote.AbstractProtocol start 信息: Starting ProtocolHandler ["http-bio-8080"]
11-11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值