- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑这样的情况:有一个简单的程序:
int main()
{
for (int i = 0; i < 100; i++) {
if (i == 50){
// ... dump state of program somewhere
}
cout << i << " ";
}
return 0;
}
是否可以通过将程序状态存储到磁盘上的文件来“保存”程序状态?例如,几周后我想从文件中加载这个状态,它会从最后停止的地方继续工作(它会打印 50 51 ...
)。
最佳答案
你想做的叫做application checkpointing .另请阅读 persistence , call stack , dynamic software updating , continuation (& CPS ), database , ASLR , Garbage Collection (因为复制 GC 使用的算法非常接近检查点所需的算法),serialization , process migration维基页面,因为它们都是相关的。
当然,在有限的情况下,您可以转储 core dump并重新启动它(正如大多数其他答案所建议的那样)。但这可能行不通:
如果您的(检查点)进程有到其他服务器的网络连接(例如正在使用 libcurl 访问远程网页或内容)。
如果您的进程已经启动了其他进程并且正在通过管道或 fifos 与它们通信
如果您的流程依赖于外部服务,例如数据库服务器。
如果您的进程有一个 Graphical User Interface (它正在与 X11 或 Wayland 服务器通信)。
如果你想在几周后重启你的进程,并且你稍微改进并重新编译了它的代码(甚至在一些与计算无关的地方),或者可能只是升级了外部库,C++ 编译器,或者更改了编译(例如优化)标志。
对于多线程应用程序,您会遇到很多额外的问题(例如,如何从检查点状态重新启动它们等...)
在某些情况下,您可以为此使用一些检查点库。查看BLCR
在其他情况下,它高于最先进水平并且仍然是一个活跃的研究课题。你可以在这方面工作大约十年并获得博士学位。
在实践中,检查点非常重要,您应该在开始编写第一行 C++ 代码之前考虑一下。它对您的软件架构设计有着深远的影响。
在某些情况下,甚至值得花几周的时间来开发专门的 C++ 代码生成器(以生成用于持久性和检查点的代码)。
在某些领域,特别是 HPC 和关于 supercomputers 的许多科学计算,检查点是必不可少的;例如,模拟两个星系的碰撞可能需要在一台非常昂贵的 super 计算机上进行数月的计算(它可能会在如此巨大的模拟结束之前重新启动),当然你需要在编写第一行代码之前考虑检查点.如果代码本质上是非常迭代的,它实际上可能很简单(原则上),因为您“只”需要保存在某个高级循环中计算的数据。在实践中,它是复杂的,细节决定成败。
一些语言实现对检查点的支持有限。例如(在 Common Lisp 中)SBCL提供其 save-lisp-and-die
原始。 GNU emacs 有 unexec (但也要看 here ,因为它可能会过时)。
应用持久化和数据是一个非常重要的课题。在许多情况下,数据比应用程序本身更有值(value)(那么,您应该对数据库感兴趣,从 Sqlite 到 PostGreSQL & MongoDB )。
附言。非常不幸的是,您的问题没有提供更多的背景和动机。你确定它不是XY problem吗? ?
关于c++ - 是否可以卡住和转储程序状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40268056/
我正在为我的应用程序使用 Tank-Auth。我唯一的问题是激活和重置帐户密码。 用于登录、注册、注销;我对这些代码没有问题; $route['login'] = "/auth/login"; $ro
我是一名优秀的程序员,十分优秀!