5

给定两个 Erlang 节点,“foo@host”和“bar@host”,下面会在“foo”上生成一个打印输出:

(foo@host) rpc:call('bar@host', io, format, ["~p", [test]]).

虽然在“栏”上打印出以下内容:

(foo@host) rpc:call('bar@host', erlang, display, [test]).

即使erlang:display/1应该仅用于调试,这两个函数都应该将内容发送到标准输出。每个进程都应该从其父进程继承组长,所以我希望这两个函数会以一致的方式运行。

上述行为有什么理由吗?

4

1 回答 1

12

这种行为差异的原因在于输出的位置和人员:

  • erlang:display/1是一个BIF,由 BEAM 直接处理,BEAM 直接将其写入其标准输出,而无需靠近 Erlang 的 io 系统。所以这样做bar会导致它打印到bar的标准输出。

  • io:format/1/2由 Erlang io 系统处理。由于没有IoDevice给出它,它会向其组长发送一个 io-request 。其rpc:call/4实现方式是远程生成的进程继承执行 RPC 调用的进程的组长。所以输出到调用进程的标准输出。foo因此,对节点进行 RPC 调用bar会导致输出进入foo的标准输出。

因此差异。有趣的是,在 Erlang io 系统中不需要对此进行特殊处理,一旦设置了组长,它就可以透明地工作。

于 2012-09-19T11:51:14.683 回答