使用TerminateProcess时究竟有什么风险?

时间:2009-08-14 05:38:23

标签: windows winapi visual-c++ process

我的Win32控制台应用程序使用第三方库。退出WinMain后,全局对象破坏开始,AV发生在内部深处。我真的很想写

TerminateProcess( GetCurrentProcess(), 0 );

靠近WinMain的尽头。如果我这样做,应用程序将正常结束。

MSDN says这样做可以危害动态链接库(DLL)维护的全局数据状态,这一点并不清楚。我明白,如果我有一些全局对象,它的析构函数不会运行,我冒险没有最终确定数据库连接或类似的东西。我的程序中没有这样的东西。

使用TerminateProcess时的风险究竟是什么?我如何确定是否可以将其用于我的目的?

4 个答案:

答案 0 :(得分:6)

基于该文档和ExtiProcess,似乎主要关注的是在没有使用标志DLL_PROCESS_DETACH调用DllMain的情况下卸载DLL。

My 2cents:文档很偏执,你会破坏在DllMain + DLL_PROCESS_DETACH中运行的一些关键操作。任何依赖于维持关键状态的人都已经受到任务管理员的支配,所以我没有看到使用这个API的巨大风险。

答案 1 :(得分:6)

AFAIK,如果你没有做任何“花哨”(包括但不限于:创建线程,锁,数据库连接,使用COM对象),不会发生任何可怕的事情。但是作为Earwicker says,你不知道 DLL正在做什么操作系统的东西,你当然不知道将来是否会改变,所以依赖于此非常脆弱。

您是否想知道为什么会发生此访问冲突?它很可能是早期腐败的迹象。请至少确认该错误是由此第三方库引起的,例如:通过编写一个与库链接但main()无效的程序,并确认这会导致同样的崩溃。

答案 2 :(得分:5)

通常,在与流程外部的对象进行交互时会发生不好的事情。例如,假设您有一些共享内存,您的进程将写入多个进程,并读取或写入其他进程。通常,为了同步读取和写入,使用互斥锁。如果进程中的线程已获取互斥锁并且在调用TerminatePorcess时正在进行更改,则互斥锁将被放弃,共享内存可能会处于不一致状态。

我怀疑你错过了使用其中一个第三方库。 DllMain有点限制,因此库可能会初始化和取消初始化您应该调用的函数。

答案 3 :(得分:4)

这取决于您如何解释“全球数据”。如果你认为(就像我通常那样)存储在进程地址空间中的数据,那么这些建议没有任何意义 - 我们知道内存将会消失,那么谁在乎这会发生什么呢?

所以它可能指的是DLL可能已经完成的操作系统范围内的东西,这些东西在任何进程的生命周期之外都会存在。一个简单的例子是可能需要清理的临时文件;使进程崩溃太多次,你的磁盘空间不足,所以最好不要养成习惯。