在服务器中,我试图将它连接的客户端及其PID存储在ets表中。
在启动服务器时创建表
initate_server() ->
ets:new(users, [set, named_table]).
当用户连接到服务器时,我正在调用一个功能
add_user(PID, Nick) ->
ets:insert_new(users, {Nick, PID}).
这反过来会产生一个错误,说我在上面使用了一个错误的参数。是否可以将PID存储在这样的ets表中?
错误说明如下:
Something went very wrong!
{{case_clause,
{'EXIT',
{badarg,
[{ets,insert,[users,{"user01", <0.66.0>}],[]},
{server, loop, 2,
[{file,
filenames and such...
答案 0 :(得分:4)
是的,您可以将pids存储在ETS表中。 badarg
错误的原因可能是访问控制。
默认情况下,使用protected
访问权限创建ETS表。这意味着任何进程都可以从表中读取值,但只有创建表的进程才能为其写入值。根据您希望它的工作方式,您可以让客户端进程向服务器发送消息以插入新值,或者使用public
选项创建表,这样任何进程都可以写入表。 / p>
答案 1 :(得分:3)
执行ets时,你确定你的ets表仍然存在:insert_new / 2?
一旦创建它的进程死亡,ets表就会消失。如果你在shell(或shell调用的函数)中创建它,它会在你输入错误时立即消失,产生错误(一个简单的2/0就会这样做)。如果你在shell生成的函数中创建了ets,它会在此函数结束或死亡时立即消失。 Steve Vinoski在这里有一篇关于ets的有趣论文:Don’t Lose Your ets Tables以及DeadZen在etsgive
的实现