2014-10-06 2 views
0

На сервере я пытаюсь сохранить подключенные клиенты и их PID в таблице ets.Erlang: Хранить PID в ETS

таблица создается как сервер запускается

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

Когда пользователь подключается к серверу я звоню функцию

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

Это, в свою очередь, генерирует ошибку говоря I» m используя плохой аргумент выше. Можно ли хранить PID в таблице ets, как это?

Ошибка говорит следующее:

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

     filenames and such... 

ответ

3

Да, вы можете хранить ИДП в таблицах ETS. Причиной ошибки badarg является, вероятно, контроль доступа.

По умолчанию таблицы ETS создаются с доступом protected. Это означает, что любой процесс может считывать значения из таблицы, но только процесс, который создал таблицу, может записывать в него значения. В зависимости от того, как вы хотите, чтобы он работал, вы могли либо отправить клиентский процесс на сервер, чтобы вставить новые значения, либо создать таблицу с опцией public, которая позволяет любому процессу записывать в таблицу.

+0

Вы, наконец, решили. – xsiand

3

Вы уверены, что ваша таблица ets все еще существует, когда вы выполняете ets: insert_new/2?

Стол ets исчезает, как только процесс, который его создал, умирает. Если вы создадите его в оболочке (или функции, вызванной оболочкой), она исчезнет, ​​как только вы напечатаете что-то неправильно, генерируя ошибки (это сделает просто 2/0.). Если вы создали ets в функции, порожденной оболочкой, она исчезнет, ​​как только эта функция закончится или умрет. есть интересная статья о ets от Стива Виноски здесь: Don’t Lose Your ets Tables и реализация DeadZen здесь etsgive

Смежные вопросы