2014-10-06 55 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