我的理解是,当您通过Windows XP中的任务管理器终止C ++应用程序时,应用程序仍然“干净地”被破坏 - 即调用堆栈将展开并且将调用所有相关的对象析构函数。不确定我的理解是不是错了。
是否可以立即杀死这样的应用程序,而无需展开堆栈?
例如,应用程序可以使用RAII模式,当对象被破坏时,RAII模式将破坏或释放资源。如果通过任务管理器的传统“杀戮过程”是优雅的,提供一种方法来杀死应用程序立即将允许我测试非正常关机(例如停电)。
修改
只是为了澄清,我正在使用现有的实用程序或程序来允许我这样做。我应该可以在我没有源代码的程序上使用该解决方案,这意味着程序化解决方案不是真的可以接受。
修改
只是为了提供更多的上下文,有时我必须使用非常具有侵入性的第三方服务(例如,每小时都要唠叨我重启)。因为我知道我不需要需要重启,所以我想杀死进程/服务,所以它不再惹恼我了。不幸的是,一些第三方开发人员“聪明”到足以阻止我这样做,当我通过任务管理器终止进程时,系统将立即重启(我猜这是使用RAII来实现这一点)。
答案 0 :(得分:8)
我相信任务管理器通过发送WM_CLOSE消息尝试“好”关闭,然后如果应用程序没有响应它就会被杀死。
此调用应立即终止进程而不发出警告:
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>