如何处理gen_fsm的终止

时间:2011-05-20 11:02:03

标签: erlang supervisor gen-fsm

我有一个MAIN进程,它产生gen_fsm行为的实现,但是这个MAIN进程不是supervisor行为的实现,它只是另一个模块。 假设gen_fsm的实现称为GAME_ROOM。 我的情况是这样的:

  1. 当有3个人准备就绪时,MAIN过程将产生一个新的GAME_ROOM。
  2. 我使用gen_fsm:start_link函数来启动一个新的GAME_ROOM,所以如果GAME_ROOM错误退出,我的MAIN进程可能会产生一个新进程,以替换被击落的进程。
  3. 我设法让我的MAIN进程检测到所有被击落的GAME_ROOM
  4. 的EXIT事件

    问题是:我需要在新的状态下恢复所有被击落的GAME_ROOM状态。 我的问题是:如何使用gen_fsm的终止函数将gen_fsm的最新状态传递给我的MAIN进程,所以当我重新生成一个新的GAME_ROOM时,我可以传递那些状态?

4 个答案:

答案 0 :(得分:1)

阅读process_flag({trap_exit,true})并处理信息'EXIT'。

答案 1 :(得分:1)

一种简单的方法是让GAME_ROOM terminate/3向MAIN发送包含必要状态信息的消息。为了实现这个目的,GAME_ROOM必须知道MAIN的pid(简单),你必须确定terminate/3真的被称为。{/ p>

答案 2 :(得分:0)

首先,我建议您在实施中考虑使用主管,以避免重新发明轮子。

可能是在MAIN中创建一个ETS表,因此您可以存储gen_fsms中的数据,这些数据可以在进程崩溃中存活。

答案 3 :(得分:0)

我的信念是,如果GAME_ROOM由于错误而退出,则无需保存(您如何知道您的状态是有效的,否则您会将错误记录在GAME_ROOM中)。

相关问题