有可能杀死一个C++;Windows XP上的应用程序而不展开调用堆栈? 我的理解是,当您通过Windows XP中的任务管理器杀死C++应用程序时,应用程序仍然“干净”地被破坏——即调用堆栈将被解除,所有相关的对象析构函数都将被调用。不确定我的理解是否有误

有可能杀死一个C++;Windows XP上的应用程序而不展开调用堆栈? 我的理解是,当您通过Windows XP中的任务管理器杀死C++应用程序时,应用程序仍然“干净”地被破坏——即调用堆栈将被解除,所有相关的对象析构函数都将被调用。不确定我的理解是否有误,c++,process,windows-xp,callstack,raii,C++,Process,Windows Xp,Callstack,Raii,是否可以在不展开堆栈的情况下立即杀死这样的应用程序 例如,应用程序可能采用RAII模式,当对象被破坏时,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>