C++ 我有一个c++;在linux上运行的程序,是否可以让它定期将状态快照存储在共享内存中,以便进行崩溃后恢复?

C++ 我有一个c++;在linux上运行的程序,是否可以让它定期将状态快照存储在共享内存中,以便进行崩溃后恢复?,c++,linux,shared-memory,C++,Linux,Shared Memory,我不知道该怎么做,因为我见过用于进程间通信的共享内存示例。我想知道我是否可以从服务器中利用它来获取某些对象的定期快照,并将它们以某种格式转储到共享内存中。如果我的程序崩溃,可以在程序重新启动时检索这些快照以进行部分恢复。这是否可行?如果是的话,我可以看些什么来开始呢 更新: 我在某个地方读到,linux上的共享内存(我在linux上)是持久的,所以我想我可能能够定期保存状态快照,而不需要帮助进程。例如,我每隔几秒钟将一个不断更新的结构转储到共享内存中。我选择共享内存而不是文件的原因纯粹是为了速度

我不知道该怎么做,因为我见过用于进程间通信的共享内存示例。我想知道我是否可以从服务器中利用它来获取某些对象的定期快照,并将它们以某种格式转储到共享内存中。如果我的程序崩溃,可以在程序重新启动时检索这些快照以进行部分恢复。这是否可行?如果是的话,我可以看些什么来开始呢

更新: 我在某个地方读到,linux上的共享内存(我在linux上)是持久的,所以我想我可能能够定期保存状态快照,而不需要帮助进程。例如,我每隔几秒钟将一个不断更新的结构转储到共享内存中。我选择共享内存而不是文件的原因纯粹是为了速度,因为状态将是大量的二进制数据。

这只是一个想法(没有在类似Uni*x的系统上尝试过)

执行fork(2)并向该子进程(或创建核心转储的任何子进程)发送SIGTRAP信号

Fork复制原始流程环境。这将转储满内存状态。然后,可以通过gdb(或类似工具)进行分析。当然不是为了恢复

您可以创建一个
gdbinit
文件,并且可以使用核心文件从调用
gdb
的脚本中转储变量

为什么需要共享内存?将状态转储到磁盘不好吗



我认为这也可以用于恢复。Perl-u命令行参数做了类似的事情。它解析脚本文件并转储核心文件。程序可以使用此核心文件将核心直接加载到内存中,并在不进行解析的情况下启动perl。

您在Windows上吗?如果是这样的话,您可以设置在崩溃发生时收集转储。这听起来像飞行记录器?共享内存在重新启动后无法保存。您必须将数据保存在更持久的文件中。@RaymondChen“重新启动服务器”也可能意味着在从未停止运行的操作系统中“重新启动我的服务器程序”。如果您只需要恢复服务的重新启动(而不是操作系统的重新启动),您可以使用一个助手进程来保留共享内存。我想知道使用共享内存是否会更快(在写入快照和读回快照时),尤其是在快照变大的情况下。如果不是比写文件难那么多的话,我想选择共享内存的方法会更好?@Palace Chan:实际上你可以读取进程的内存,读取
/proc//mem
()。或者您可以转储到共享内存(
/dev/shm
),该内存通常安装在
/lib/init/rw
(请参见
df
)。或者,您可以为要存储在共享内存中的所有类实现一个
new
操作符,但随后您需要实现一个低级内存管理器。我建议您使用核心转储版本。