根据《 Erlang参考手册》,the send operator (!)语法为Expr1 ! Expr2
。它指出
Expr1
可以是{Name, Node}
形式的元组,其中“ Name
是原子,Node
是节点名称,也是原子”,和[将FreeSWITCH与mod_erlang_event
一起使用(这会启动一个Erlang C节点),并且发送带有任何原子作为mod_erlang_event
的消息,将导致响应:
我理解“成功”表示“未崩溃”或“未返回错误”,而不是“将返回消息”。
Name
为什么在下面的两个常规Erlang节点上不起作用?
上面的原子也不是注册的过程,消息发送就像远程过程调用。
偷看了$ erl -sname test -setcookie ClueCon
Erlang/OTP 19 [erts-8.2.1] [source] [64-bit] [async-threads:10] [kernel-poll:false]
Eshell V8.2.1 (abort with ^G)
(test@tr2)1> {polgarjenohivatalba, freeswitch@tr2} ! {api, msleep, 500}.
{api,msleep,500}
(test@tr2)2> receive X -> X after 1000 -> to end.
{ok,"+OK"}
(test@tr2)3> {vizbolveszikiazoxigent, freeswitch@tr2} ! holafafonok.
holafafonok
(test@tr2)4> flush().
Shell got {error,undef}
(test@tr2)5> nodes().
[]
(test@tr2)6> nodes(connected).
[freeswitch@tr2]
的mod_erlang_event
,但是我没有太多的C经验,也没有使用过非本地的Erlang节点。感觉好像运行一个C节点会导致(1)运行一个Erlang节点(2)具有进程自动启动(使用C逻辑作为该进程的mod_erlang_event
循环)(3)将匹配任何原子。
所以也许这就是为什么只有显式注册的进程才能与本机Erlang节点一起使用的原因。 (再次,我可能完全错了。)
起始节点“ def”:
source
回到节点“ abc”开始较早:
receive
$ erl -sname def -setcookie lofa
Erlang/OTP 19 [erts-8.2.1] [source] [64-bit] [async-threads:10] [kernel-poll:false]
Eshell V8.2.1 (abort with ^G)
(def@tr2)1> {lofa, abc@tr2} ! miez.
miez
(def@tr2)2> nodes(connected).
[abc@tr2]
和$ erl -sname abc -setcookie lofa
Erlang/OTP 19 [erts-8.2.1] [source] [64-bit] [async-threads:10] [kernel-poll:false]
Eshell V8.2.1 (abort with ^G)
(abc@tr2)1> receive X -> X after 27000 -> timeout end.
timeout
(abc@tr2)2> nodes(connected).
[def@tr2]
也立即作为隐藏节点连接,但是此行为似乎与freeswitch@tr2
和test@tr2
相同。
[发送”消息“成功”(即未引发错误)与“获取响应消息”之间有区别。在我看来,在一种情况下,发送的消息成功并返回了一条消息。在另一种情况下,发送的消息成功,并且不返回任何消息。