2014-10-06 56 views
0

在一台服务器中,我试图将其连接的客户端及其PID存储在ets表中。Erlang:在ETS中存储PID

在服务器启动

initate_server() -> 
       ets:new(users, [set, named_table]). 

当用户连接到服务器,我调用一个函数

add_user(PID, Nick) -> 
     ets:insert_new(users, {Nick, PID}). 

这又产生一个错误,说我”表创建m使用上面的一个不好的论点。是否有可能像这样在一个ets表中存储一个PID?

错误说以下内容:

Something went very wrong! 
    {{case_clause, 
     {'EXIT',  
     {badarg, 
     [{ets,insert,[users,{"user01", <0.66.0>}],[]}, 
      {server, loop, 2, 
      [{file, 

     filenames and such... 

回答

3

在ETS表是的,你可以存储的PID。 badarg错误的原因可能是访问控制。

默认情况下,使用protected访问创建ETS表。这意味着任何进程都可以从表中读取值,但只有创建该表的进程才可以向其写入值。根据您希望如何工作,您可以让客户端进程向服务器发送消息以插入新值,或使用public选项创建表,从而允许任何进程写入表。

+0

你的解决方案最终证明是正确的。 – xsiand 2014-10-06 13:51:07

3

您确定在执行ets:insert_new/2时,您的ets表仍然存在吗?

只要创建它的过程消失,ets表就会消失。如果你在shell中创建它(或者shell所调用的函数),只要你输入错误产生一个错误(一个简单的2/0.就可以了),它就会消失。如果您在shell中生成的函数中创建了ets,只要此函数结束或死亡,它就会消失。 Steve Vinoski在这里有一篇关于ets的有趣论文:Don’t Lose Your ets Tables和DeadZen在这里的实现etsgive

相关问题