给定两个Erlang节点"foo @ host"和"bar @ host",以下内容在"foo"上产生打印输出:
(foo@host) rpc:call('bar@host', io, format, ["~p", [test]]).
Run Code Online (Sandbox Code Playgroud)
以下打印出"bar":
(foo@host) rpc:call('bar@host', erlang, display, [test]).
Run Code Online (Sandbox Code Playgroud)
即使erlang:display/1应该仅用于调试,两个函数都应该将内容发送到标准输出.每个进程都应该从其父进程继承组长,所以我希望这两个函数以一致的方式运行.
上述行为是否有任何理由?
rvi*_*ing 12
行为差异的原因在于输出完成的位置和方式:
erlang:display/1是一个BIF,由BEAM直接处理,直接将其写入标准输出,而无需靠近Erlang的io系统.所以这样做会bar导致它打印到bar标准输出.
io:format/1/2由Erlang io系统处理.由于没有IoDevice给出,它向其组长发送了一个io请求.rpc:call/4实现的目的是远程生成的进程继承执行RPC调用的进程的组长.因此输出转到调用进程的标准输出.因此foo,对节点执行RPC调用会bar导致输出变为foo标准输出.
因此差异.值得注意的是,在Erlang io系统中不需要对此进行特殊处理,一旦设置了组长,它就会透明地工作.