有可能杀死一个C++;Windows XP上的应用程序而不展开调用堆栈? 我的理解是,当您通过Windows XP中的任务管理器杀死C++应用程序时,应用程序仍然“干净”地被破坏——即调用堆栈将被解除,所有相关的对象析构函数都将被调用。不确定我的理解是否有误
是否可以在不展开堆栈的情况下立即杀死这样的应用程序 例如,应用程序可能采用RAII模式,当对象被破坏时,RAII模式将破坏或释放资源。如果传统的通过任务管理器的“终止过程”是优雅的,那么提供一种立即终止应用程序的方法将允许我测试非紧急关闭(例如断电) 编辑: 我只是想澄清一下,我是在寻找一个现有的实用程序或程序,可以让我这样做。我应该能够在没有源代码的程序上使用该解决方案,这意味着编程解决方案实际上是不可接受的 编辑:有可能杀死一个C++;Windows XP上的应用程序而不展开调用堆栈? 我的理解是,当您通过Windows XP中的任务管理器杀死C++应用程序时,应用程序仍然“干净”地被破坏——即调用堆栈将被解除,所有相关的对象析构函数都将被调用。不确定我的理解是否有误,c++,process,windows-xp,callstack,raii,C++,Process,Windows Xp,Callstack,Raii,是否可以在不展开堆栈的情况下立即杀死这样的应用程序 例如,应用程序可能采用RAII模式,当对象被破坏时,RAII模式将破坏或释放资源。如果传统的通过任务管理器的“终止过程”是优雅的,那么提供一种立即终止应用程序的方法将允许我测试非紧急关闭(例如断电) 编辑: 我只是想澄清一下,我是在寻找一个现有的实用程序或程序,可以让我这样做。我应该能够在没有源代码的程序上使用该解决方案,这意味着编程解决方案实际上是不可接受的 编辑: 只是为了提供更多的上下文,有时我不得不使用非常侵入性的第三方服务(例如,唠叨
只是为了提供更多的上下文,有时我不得不使用非常侵入性的第三方服务(例如,唠叨我每小时重新启动一次)。因为我知道我不需要重新启动,所以我想终止进程/服务,这样它就不会再烦我了。不幸的是,一些第三方开发人员“聪明”到足以阻止我这样做,当我通过Task Manager终止进程时,系统将立即重新启动(我猜是使用RAII实现的)。我相信Task Manager通过发送WM_CLOSE消息来尝试“良好”关机,然后,如果应用程序没有响应,它将被终止 此调用应立即终止进程而不发出警告: e、 g: 更新: 您可能会发现这篇文章很有趣: 更新2: 我应该能够在没有源代码的程序上使用解决方案 嗯,99.9%的时候这是不受欢迎的行为 SysInternals有一个名为
pskill
的实用程序:
但我不确定它有多“好”
您可能需要自己动手,但这应该很容易:
DWORD pid = <get pid from command line>;
TerminateProcess(OpenProcess(PROCESS_TERMINATE, FALSE, pid));
DWORD-pid=;
TerminateProcess(OpenProcess(PROCESS_TERMINATE,FALSE,pid));
我相信C标准库方法退出(0)将完全做到这一点,在不调用任何析构函数、DealLocator等的情况下中止程序
试试看,让我知道它是否满足您的需要?看起来abort()会让您异常退出
ANSI 4.10.4.1关于打开和临时文件的中止功能的行为
中止功能不关闭打开或临时的文件。它不会冲洗水流
缓冲区
及
中止当前进程
异常程序终止时中止进程。
该函数生成SIGABRT信号,默认情况下会导致程序终止>向主机环境返回不成功的终止错误代码。
程序终止时不执行自动或静态对象的析构函数
存储持续时间,并且不调用任何atexit函数。
函数永远不会返回到它的调用者。
我会按照你的建议去做。我猜这也会失败。如果第三方服务真的很重视避免死亡,那么服务定义可能会设置为“崩溃时重新启动”。另一种常见的方法是使用另一个服务来监视主服务。主服务通常设置一个全局事件,或使用看门狗服务监视的其他一些通知机制。如果主服务没有通知看门狗,则看门狗将重新启动计算机。名称恰当的,可从Microsoft下载。也是Windbg套件的一部分
Kill工具Kill.exe终止
一个或多个进程及其所有
线程。此工具仅适用于
在本地计算机上运行的进程
电脑
kill/f
例如,kill/f lsass
(只是开玩笑,不要kill LSA!)。
如果您想自己启动,TerminateProcess是一个不错的选择。标准库中的C函数abort()将立即终止您的应用程序,而无需清理
C++定义了一个标准的全局函数terminate()。调用它也会立即退出您的应用程序
set_terminate函数可以覆盖技术上terminate()的行为。默认情况下,它调用abort。不依赖第三方工具的Windows标准方法是使用
taskkill/f
:
taskkill /f <process-id>
taskkill /f /im <process-executable-name>
taskkill/f
taskkill/f/im
/f
在这里表示“强制”,并确保进程无条件地立即终止,没有查询或警告。有一些实用程序可以禁止重新启动
例如,有一个复选框隐藏在某个地方,它会在启动重启时询问您。许多抗病毒用户都将其检测为rootkit(确实如此,但这一个被认为是驯服的),因此在您无法完全控制的系统上运行(当域策略等强制要求使用防病毒时),除非我大错特错(我只是做了一些测试来确认),任务管理器根据您使用的选项卡,尝试以不同的方式关闭程序。如果通过“应用程序”选项卡并按“结束任务”,它将尝试通过首先发送WM_close来干净地关闭程序。但是,如果通过processs选项卡并按下End Process,它似乎使用了与TerminateProcess类似的东西,这意味着没有堆栈展开等 因此,首先,如果您没有使用“流程”选项卡上的“结束流程”,请尝试使用该选项 如果你已经尝试过了,但是他们的软件仍然能够以某种方式重新启动系统,那么我就可以了
kill /f <process>
taskkill /f <process-id>
taskkill /f /im <process-executable-name>