是否有可能在不松开调用堆栈的情况下终止Windows XP上的C ++应用程序?

时间:2009-08-26 01:46:23

标签: c++ process windows-xp callstack raii

我的理解是,当您通过Windows XP中的任务管理器终止C ++应用程序时,应用程序仍然“干净地”被破坏 - 即调用堆栈将展开并且将调用所有相关的对象析构函数。不确定我的理解是不是错了。

是否可以立即杀死这样的应用程序,而无需展开堆栈?

例如,应用程序可以使用RAII模式,当对象被破坏时,RAII模式将破坏或释放资源。如果通过任务管理器的传统“杀戮过程”是优雅的,提供一种方法来杀死应用程序立即将允许我测试非正常关机(例如停电)。

修改

只是为了澄清,我正在使用现有的实用程序或程序来允许我这样做。我应该可以在我没有源代码的程序上使用该解决方案,这意味着程序化解决方案不是真的可以接受。

修改

只是为了提供更多的上下文,有时我必须使用非常具有侵入性的第三方服务(例如,每小时都要唠叨我重启)。因为我知道我不需要需要重启,所以我想杀死进程/服务,所以它不再惹恼我了。不幸的是,一些第三方开发人员“聪明”到足以阻止我这样做,当我通过任务管理器终止进程时,系统将立即重启(我猜这是使用RAII来实现这一点)。

9 个答案:

答案 0 :(得分:8)

我相信任务管理器通过发送WM_CLOSE消息尝试“好”关闭,然后如果应用程序没有响应它就会被杀死。

此调用应立即终止进程而不发出警告:

TerminateProcess

e.g:

TerminateProcess(GetCurrentProcess(), 1);

更新

您可能会发现这篇文章很有趣:

Quitting time: exiting a C++ program

更新2:

  

我应该可以在我没有

源代码的程序上使用该解决方案
嗯,这是99.9%的时间不良行为。

SysInternals有一个名为pskill的实用程序:

http://technet.microsoft.com/en-us/sysinternals/bb896683.aspx

但我不确定它是多么“好”。

你可能需要自己动手,但这应该很简单:

DWORD pid = <get pid from command line>;

TerminateProcess(OpenProcess(PROCESS_TERMINATE, FALSE, pid));

答案 1 :(得分:2)

在不依赖第三方工具的情况下执行此操作的标准Windows方法是使用taskkill /f

taskkill /f <process-id>
taskkill /f /im <process-executable-name> 

/f在这里意味着“强制”,并确保无条件且立即终止进程,无需查询或警告。

答案 2 :(得分:2)

除非我非常错误(我只是做了一些测试以确认),任务管理器会尝试以不同的方式关闭程序,具体取决于您使用的是哪个选项卡。如果通过“应用程序”选项卡并按“结束任务”,它将尝试通过首先发送WM_CLOSE来干净地关闭程序。但是如果通过Processes选项卡并按End Process,它似乎使用了TerminateProcess的内容,这意味着没有堆栈展开等等。

首先,如果您没有在“进程”选项卡上使用“结束进程”,请尝试使用。

如果这是你已经尝试过的,而且他们的软件仍然设法以某种方式重新启动系统,那么就会发生更复杂的事情。其他人可能正在谈论有其他流程。

答案 3 :(得分:0)

我相信C标准库方法 exit(0); 将完全这样做,在不调用任何析构函数,解除分配器等的情况下中止程序。

尝试一下,让我知道它是否符合您的需求?

答案 4 :(得分:0)

看起来abort()会给你一个异常退出。

  

ANSI 4.10.4.1中止函数关于打开和临时文件的行为   中止功能不会关闭打开或临时的文件。它不会刷新流   缓冲区   [source]

  

中止当前流程   使用异常程序终止中止进程。   该函数生成SIGABRT信号,该信号默认使程序终止&gt;将不成功的终止错误代码返回给主机环境。   程序终止而不执行自动或静态对象的析构函数   存储持续时间,并且不调用任何atexit函数。   该函数永远不会返回其调用者。   [source]

答案 5 :(得分:0)

我会按PSKill的建议尝试Tim above。我猜这也会失败。如果第三方服务真的非常重视避免死亡,那么服务定义可能被设置为“崩溃时重启”。另一种常见的方法是使用另一种监视器作为主要服务的服务。主服务通常设置全局事件或使用监视服务监视的其他一些通知机制。如果主服务未通知监视程序,则监视程序将重新启动计算机。

答案 6 :(得分:0)

适当命名的Kill Tool,可从Microsoft下载获得。也是Windbg套件的一部分。

  

Kill工具kill.exe终止   一个或多个流程及其所有流程   线程。此工具仅适用于   在本地运行的进程   计算机。

kill /f <process>

例如,kill /f lsass(开玩笑,杀死LSA!)。 如果你想自己动手,可以选择TerminateProcess。

答案 7 :(得分:0)

标准库中的C函数abort()将立即终止您的应用程序而不进行清理。

C ++定义了一个标准的全局函数terminate()。调用它也会立即退出您的应用程序。

技术上,terminate()的行为可以被set_terminate函数覆盖。它默认调用abort。

答案 8 :(得分:0)

周围有一些实用程序可以禁止重启。

例如,

HideToolz就是这样做的 - 有一个隐藏在某个地方的复选框会让它在你启动重启时询问你。它被许多防病毒软件检测为rootkit(它确实是驯服的,但是这个应该是驯服的),所以在你没有完全控制的系统上运行(当域策略规定的防病毒等)时,它可能是探测性的。 p>