代码之家  ›  专栏  ›  技术社区  ›  sharptooth

使用TerminateProcess时的风险到底是什么?

  •  5
  • sharptooth  · 技术社区  · 15 年前

    我的win32控制台应用程序使用第三方库。当它退出winmain global objects后,就会开始破坏,并且在内部深处发生AV。我真的很想写

    TerminateProcess( GetCurrentProcess(), 0 );
    

    在温梅因的尽头。如果我这样做,应用程序将优雅地结束。

    但是 MSDN says 这样做可以 危害动态链接库(DLL)维护的全局数据的状态 这还不清楚。我理解,如果我有一些全局对象,它的析构函数就不会运行,并且我有没有完成数据库连接或类似的风险。我的程序中没有类似的东西。

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

    4 回复  |  直到 15 年前
        1
  •  5
  •   Stephen Nutt    15 年前

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

    我怀疑你错过了使用第三方图书馆。dllmain有点限制,因此库可能具有要调用的初始化和取消初始化函数。

        2
  •  6
  •   JaredPar    15 年前

    基于该文档和extiprocess,主要的问题似乎是卸载dll时没有调用带有标志dll_process_detach的dllmain。

    我的2注意事项:文档是偏执的,您会破坏在dllmain+dll_进程_detach中运行的一些关键操作。任何依赖它来维持关键状态的人都已经由任务管理器控制了,所以我认为使用这个API不会有很大的风险。

        3
  •  6
  •   Community leo1    7 年前

    Afaik,如果你没有做任何“花哨”的事情(包括但不限于:创建线程、锁、数据库连接、使用COM对象),就不会发生什么可怕的事情。但是作为 Earwicker says 不知道 一个动态链接库在做什么样的操作系统范围的事情,你当然不知道将来会不会改变,所以依赖于它是非常脆弱的。

    您不想知道为什么会发生这种访问冲突吗?这很可能是某种东西在很早以前就被破坏的迹象。至少请 确认 错误是由第三方库引起的,例如,编写一个与库链接但 main() 什么都不做,并确认这会导致相同的崩溃。

        4
  •  4
  •   Daniel Earwicker    15 年前

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

    因此,它可能指的是一个动态链接库可能已经完成的操作系统范围的工作,这些工作在任何进程的生命周期之外都会持续存在。一个简单的例子是一个临时文件,它可能需要清理;过程崩溃太多次,磁盘空间就会耗尽,所以最好不要养成这样的习惯。