5

2つの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、両方の関数が標準出力にデータを送信することになっています。各プロセスはその親からグループリーダーを継承する必要があるため、2つの関数は一貫した方法で動作することが期待されます。

上記の動作の理由はありますか?

4

1 に答える 1

12

この動作の違いの理由は、出力がどこ誰によって行われるかです。

  • erlang:display/1BIFであり、BEAMによって直接処理されます。BEAMは、Erlangのioシステムの近くに行かなくても、標準出力に直接書き込みます。したがって、これを実行すると、の標準出力に出力barされます。bar

  • io:format/1/2Erlangio-systemによって処理されます。何も与えられていないので、グループリーダーIoDeviceにio-requestを送信します。は、リモートで生成されたプロセスがRPC呼び出しを実行するプロセスのグループリーダーを継承するように実装されています。したがって、出力は呼び出しプロセスの標準出力に送られます。したがって、ノードに対してRPC呼び出しを実行すると、出力はの標準出力になります。rpc:call/4foobarfoo

したがって、違い。興味深いことに、Erlang ioシステムではこれを特別に処理する必要はありません。グループリーダーが設定されると、すべてが透過的に機能します。

于 2012-09-19T11:51:14.683 に答える