确保流程关闭
Ensure process closure
我有一个程序,它绝对需要能够在每次需要时成功关闭自己。
但我不知道该怎么做。
它在用户模式下运行,虽然我不知道该怎么做,但有人可能会阻止它从内核模式关闭,我想以某种方式防止这种情况发生。
是否有我可以调用的函数,或者我可以覆盖内存的某个部分,以确保我的进程退出?
当然,没有什么是愚蠢的,但我想知道你知道的最好的方法。
总结大量评论:
-
如果您不能信任底层操作系统,则无法保证任何类型的用户模式行为;世界不是这样运转的。
-
任何具有管理权限的外部程序都可以对您的代码运行调试器以暂停它,在那里它可以检查内存并窃取机密,更改程序代码,甚至注入一个新线程(至少在Windows上(来运行并在您的";真实的";代码运行。这是一个非常恶劣的工作环境。
-
你说你不担心秘密被窃取,这很有帮助,所以当你决定停止时,你能做的最好的事情就是调用操作系统原语,让进程退出。用于退出当前程序的
ExitProcess()
,或在您自己的句柄上调用TerminateProcess()
。如果这些不是确定的击杀,你几乎没有其他办法了。
我对volatile/atomic变量的建议更像是对一个荒谬前提的荒谬回应:如果你认为ExitProcess
可能已经被钩住了,那么你可以把这个调用放在一个循环中,这样主代码就不会做任何真正的工作,即使它确实留在内存中。
// this is ridiculous
#include <atomic> // hat tip to @Scheff
extern atomic_bool shouldShutdown = false;
void checkShutdown(void)
{
// looping in case unicorns have hooked the OS
while (shouldShutdown) ExitProcess(1);
}
在每个线程的主循环顶部调用checkShutdown()
,这样它至少会停止执行实际工作。
然而:尽管我喜欢大声思考有趣的问题,但这是一个完全荒谬的解决方案:如果ExitProcess
不起作用,你将面对一个比你更想要它的对手,我同意@jwdonahue的观点,认为这是一种商业模式问题,而不是技术问题。
EDIT考虑到这一点,checkShutdown()
不仅可以在检查变量时循环,而且可以递归地执行来破坏堆栈,这意味着所有线程最终都会被杀死。
感觉就像代码高尔夫:-(
此外,我不敢相信我还在考虑这个问题,我们真的需要在这个上下文中使用TerminateProcess
而不是ExitProcess
,因为后者的声明在<winnt.h>
中用__declspec(noreturn)
修饰,编译器知道它之外的代码是不可访问的,所以我们的一些疯狂的恶作剧可能会被优化掉。
void checkShutdown(void)
{
while (shouldShutdown) {
TerminateProcess(GetCurrentProcess(), 1);
checkShutdown();
}
}
这个递归调用可以被优化为迭代调用,这可能不是不可能的——它不是完全的尾递归,但很接近——但我不打算看那么多细节来解决它。
- MESI协议和std::atomic-它是否确保所有写入立即对其他线程可见?
- 确保流程关闭
- 如何正确关闭升压线程
- 通过安装信号处理程序关闭多线程应用程序
- 如何完全关闭 TBB 代码中的线程
- 如何在 qt 中从另一个线程运行 qt并发时关闭程序
- 成功完成TLS握手后,服务器关闭时出现错误的SSL例程:SSL3_GET_RECORD:错误的版本号
- 确保静态布尔检查的线程安全
- 如何确保槽在特定线程的上下文中执行?
- 在接收 SIGINT 操作时适当地关闭多线程 c++ 应用程序
- 是否可以在C++中关闭线程安全?
- 如何从另一个线程关闭对话框?QT
- 生产者/使用者,如何确保在关闭所有使用者之前耗尽线程安全队列
- 主线程关闭,而工作线程未完成
- 在后台线程上创建的调度程序未关闭时会发生什么情况?如何确保调度程序已正确关闭
- 从另一个线程关闭WINAPI中的重定向控制台
- 从另一个线程关闭QTcpSocket
- MetaTrader4在WinXP模式虚拟PC上的deinit()+dll线程关闭(崩溃?)
- 套接字描述符在特定条件下从另一个线程关闭,当同一套接字上的accept()调用在Linux中进行时
- 等待线程关闭时Boost互斥抛出错误