2010-10-19 1 views

ответ

5

Я предполагаю, что вы хотите это для какой-то отладки/интроспекции цели, а не для общего использования в вашем коде:

erlang:process_info(Pid, registered_name). 

Дает [], если процесс не имеет локально зарегистрированного имени, и {registered_name, Name} если есть.

+1

Вы также можете использовать: proplists: get_value (зарегистрированное имя, erlang: process_info (Pid)). Возвращает имя сразу или атом не определен. Тем не менее. –

+0

Цель: у меня есть gen_server, который служит основным поведением для набора процессов. Тем не менее, каждый процесс должен иметь некоторое дополнительное поведение, которое я предоставляю с помощью своего рода «обратного» модуля. Когда супервизор начнет работу, он сделает несколько копий основного gen_server, зарегистрировав их под другим именем. Эти разные имена также будут иметь название модулей обратного вызова. Я мог бы также передать модуль обратного вызова в качестве аргумента, но зачем беспокоиться, если он уже доступен с вызовом. Или есть более чистая идея? – mwt

+1

Передача информации, читая процессы, зарегистрированное имя будет глубоко запутанным для людей, привыкших к более типичному эрланговому коду - если вы хотите, чтобы эта информация была доступна, передайте ее явно и сохраните ее в записи #state {}. Существуют всевозможные хитроумные механизмы, которые вы можете использовать для передачи информации (словарь процесса, параметризованные модули и т. П.), Но я бы рекомендовал против него, потому что это затрудняет выполнение кода. Хорошо, что в Erlang можно разглядеть эффект функции, просто взглянув на ее код и аргументы, которые ему даны. – archaelus