进程退出的清理有关问题
进程退出的清理问题
在winxp/2000/2003中,当一个进程退出时,分几种
1.exit()
2.exitprocess()
3.terminateprocess()
4.main或winmain结束
在这些情况下,系统分配的内存比如打开的文件,打开的socket,分配的内存,加载的dll,系统是怎么处理的?是全部释放还是部分释放或者不处理?
请根据以上几种情况解答一下,希望能有权威的文档说明.
------解决方案--------------------
这个问题可能有些复杂
就我知道的情况大概说明
程序不能释放的句柄(Window)包含申请系统资源,如与进程同步、内存映射有关的资源,绘图相关的DC,Opengl有关的句柄
可以释放的有与本进程相关的资源:文件句柄、内存、socket、加载的dll
------解决方案--------------------
不管哪种情况, 最终都是调用TerminateProcess结束进程的(实际是调用内核中的NtTerminateProcess)
Windows会释放进程分配的所有资源. 根据我的经验, 包括内存映射等共享资源都会释放, windows为每个进程维护了一张打开的句柄表, 而windows的机制决定了访问进程外的资源必须通过句柄, 所以进程使用的资源都会释放掉, 例外情况是如果某个内核驱动出现异常终止时则不能正常释放资源(这时也该兰屏了), 另外如果驱动分配的资源不主动释放的话是会产生泄漏的.
在winxp/2000/2003中,当一个进程退出时,分几种
1.exit()
2.exitprocess()
3.terminateprocess()
4.main或winmain结束
在这些情况下,系统分配的内存比如打开的文件,打开的socket,分配的内存,加载的dll,系统是怎么处理的?是全部释放还是部分释放或者不处理?
请根据以上几种情况解答一下,希望能有权威的文档说明.
------解决方案--------------------
这个问题可能有些复杂
就我知道的情况大概说明
程序不能释放的句柄(Window)包含申请系统资源,如与进程同步、内存映射有关的资源,绘图相关的DC,Opengl有关的句柄
可以释放的有与本进程相关的资源:文件句柄、内存、socket、加载的dll
------解决方案--------------------
不管哪种情况, 最终都是调用TerminateProcess结束进程的(实际是调用内核中的NtTerminateProcess)
Windows会释放进程分配的所有资源. 根据我的经验, 包括内存映射等共享资源都会释放, windows为每个进程维护了一张打开的句柄表, 而windows的机制决定了访问进程外的资源必须通过句柄, 所以进程使用的资源都会释放掉, 例外情况是如果某个内核驱动出现异常终止时则不能正常释放资源(这时也该兰屏了), 另外如果驱动分配的资源不主动释放的话是会产生泄漏的.