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