调试了一个通宵的Erlang服务器运行问题
早上5:43,我终于找到问题所在了。
现象:一个Erlang写的TCP服务器,在通过”erl -noshell -s mod fun”启动时总是在开始进行 gen_tcp:accept时告诉我closed。于是很恼火。
原理:以”-s mod fun”运行时,每个-s选项可以理解为一次session,该函数执行完成,也就代表该session的完成,同时清除与该session有关的所有资源,包括正在监听的socket。 所以,那个初始化socket的函数在执行完成前,启动一个微进程来等待accept也无济于事,socket还是被回收了。
解决:不让那个该死的session结束,而是给他一点有意义的,却又需要阻塞的工作来做。比如我正好需要让他在那里等待一个消息,以便允许其他进程方便的通过消息来关闭socket服务器。
另一个问题:通过Erlang shell来运行时,却不可以让初始化函数阻塞,否则下一步的活就不好做了。所以,可以考虑把阻塞部分的操作独立成一个函数来做,方便组合。