Windows进程销毁有基本的四种模式,入口函数返回,ExitProcess(),TermitateProcess(),所有线程死亡
这四种操作 只有入口函数返回是靠谱的正规操作,ExitProcess(),TermitateProcess()是危险操作,尽量避免,所有线程死亡的操作只存在于理论上。。。。。
接下来逐个简述这四种操作。
入口函数返回->程序执行完后自动退出,程序退出的时候会做以下的事:
1.将栈上面的数据全部清除。
2.将堆上面的数据全部清除。
3.设置退出代码。(将退出代码设置为入口函数的返回值)
4.内核对象的计数减一。
ExitProcess(UINT uExitCode):
这个函数可以中断进程操作,立即切断线程,让进程退出(进程中没有线程的时候就没有存在的意义,就退出了)。进程推出的时候这个函数会将他的接受到的参数设置为退出代码。但是,不会将内核对象的数量递减。关于内核对象不消亡所产生的影响后面来说。
ExitProcess(HANDLE hProcess,DWORD uExitCode)
这个函数的作用和楼上的函数差不多,但是它多了个HANDLE参数,这个HANDLE参数可以接收一个句柄,可以销毁特定的进程。
线程全部自然死亡:
这个是理论上的,这里就不说了。。。。。。
接下来说下非常重要的一个东西->内核对象计数。。。。。。。
楼上为什么都不推荐使用这些函数在中途退出进程了,就是因为这些函数都不会将内核对象的数量递减。程序结束,进程内核对象不归零就会在操作系统中残留内核对象,而操作系统中的内核对象都是共享的,你的程序用完,系统回收,在给别的程序用。如果无法将内核对象回收,操作系统的内核对象就越来越少。然后就。。。卡出翔~!!!!!!!!!!
所以,在使用进程的时候还有一个特别注意的地方,那就是当我们CreateProcess的时候,内核计数会+1,当我们初始化