Erlang:在ETS中存储PID

Erlang:在ETS中存储PID,erlang,pid,ets,Erlang,Pid,Ets,在服务器中,我试图将其连接的客户端及其PID存储在ets表中 该表是在服务器启动时创建的 initate_server() -> ets:new(users, [set, named_table]). 当用户连接到服务器时,我正在调用一个函数 add_user(PID, Nick) -> ets:insert_new(users, {Nick, PID}). 这反过来会产生一个错误,说我在使用上面的错误参数。可以在ets表格中存储

在服务器中,我试图将其连接的客户端及其PID存储在ets表中

该表是在服务器启动时创建的

initate_server() ->
                ets:new(users, [set, named_table]).
当用户连接到服务器时,我正在调用一个函数

add_user(PID, Nick) ->
         ets:insert_new(users, {Nick, PID}).
这反过来会产生一个错误,说我在使用上面的错误参数。可以在ets表格中存储PID吗

错误说明如下:

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

        filenames and such...
出了大问题!
{{case_子句,
{'EXIT',
{巴达格,
[{ets,insert,[users,{“user01”,}],]},
{服务器,循环,2,
[{文件,
文件名等。。。

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


默认情况下,ETS表是通过
受保护的
访问权限创建的。这意味着任何进程都可以从表中读取值,但只有创建表的进程可以向表中写入值。根据您希望它的工作方式,您可以让客户端进程向服务器发送消息以插入新值,或者创建可以使用
public
选项,该选项允许任何进程写入表。

执行ets:insert\u new/2时,您确定您的ets表仍然存在吗

创建ets表的进程一结束,ets表就会消失。如果在shell(或shell调用的函数)中创建ets表,当您键入错误并生成错误时,ets表就会消失(简单的2/0即可)。如果您在shell生成的函数中创建了ets,则此函数结束或终止后,ets将立即消失。这里有一篇关于ets的有趣文章,作者是Steve Vinoski,这里是DeadZen的一个实现