Windows进程销毁

来源:互联网 发布:php 百度地图api demo 编辑:程序博客网 时间:2024/06/05 17:35

Windows进程销毁有基本的四种模式,入口函数返回,ExitProcess(),TermitateProcess(),所有线程死亡


这四种操作 只有入口函数返回是靠谱的正规操作,ExitProcess(),TermitateProcess()是危险操作,尽量避免,所有线程死亡的操作只存在于理论上。。。。。


接下来逐个简述这四种操作。


入口函数返回->程序执行完后自动退出,程序退出的时候会做以下的事:

1.将栈上面的数据全部清除。

2.将堆上面的数据全部清除。

3.设置退出代码。(将退出代码设置为入口函数的返回值)

4.内核对象的计数减一。


ExitProcess(UINT uExitCode):

这个函数可以中断进程操作,立即切断线程,让进程退出(进程中没有线程的时候就没有存在的意义,就退出了)。进程推出的时候这个函数会将他的接受到的参数设置为退出代码。但是,不会将内核对象的数量递减。关于内核对象不消亡所产生的影响后面来说。


ExitProcess(HANDLE hProcess,DWORD uExitCode)

这个函数的作用和楼上的函数差不多,但是它多了个HANDLE参数,这个HANDLE参数可以接收一个句柄,可以销毁特定的进程。


线程全部自然死亡:

这个是理论上的,这里就不说了。。。。。。


接下来说下非常重要的一个东西->内核对象计数。。。。。。。


楼上为什么都不推荐使用这些函数在中途退出进程了,就是因为这些函数都不会将内核对象的数量递减。程序结束,进程内核对象不归零就会在操作系统中残留内核对象,而操作系统中的内核对象都是共享的,你的程序用完,系统回收,在给别的程序用。如果无法将内核对象回收,操作系统的内核对象就越来越少。然后就。。。卡出翔~!!!!!!!!!!


所以,在使用进程的时候还有一个特别注意的地方,那就是当我们CreateProcess的时候,内核计数会+1,当我们初始化

typedef struct _PROCESS_INFORMATION {
HANDLE hProcess; //Process内核对象在+1
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
}
的时候,会在次让内核对象计数再次+1,这样来看,其实在初始化CreateProcess的时候,其实内核计数是+2的,并非表面上的+1,所以在实际运用中,如果一个进程不需要的时候就要马上调用一次CloseHandle将内核计数减一,这样在程序正常返回退出的时候才能做到将内核对象的计数归0,系统才能回收内核对象,才不会导致内存内核对象的泄漏。

原创粉丝点击