2012-09-19 4 views
5

2つのErlangのノード、「FOO @ hostの」と「バー@ホスト」を考えると、以下は「foo」というのプリントアウトを生成します。リモートノード、グループのリーダーやプリントアウト

([email protected]) rpc:call('[email protected]', io, format, ["~p", [test]]). 

次のプリントながらうち「バー」上:erlang:display/1はデバッグのみに使用されることになっている場合でも

([email protected]) rpc:call('[email protected]', erlang, display, [test]). 

、両方の機能が標準出力にものを送ることになっています。各プロセスは親からグループリーダーを継承する必要があるので、2つの関数が一貫した方法で動作することが期待されます。

上記の動作の根拠はありますか?

答えて

12

行動で、この違いの理由はと出力が行われている誰によって次のとおりです。

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

  • io:format/1/2はErlang ioシステムで処理されます。 IoDeviceが与えられていないので、それはグループリーダーにio要求を送信します。 rpc:call/4は、リモートで生成されたプロセスがRPC呼び出しを行うプロセスのグループリーダーを継承するように実装されています。したがって、出力は呼び出し元プロセスの標準出力に送られます。したがって、ノードbarへのfooのRPCコールを実行すると、出力はfooの標準出力になります。

です。グループリーダがすべて透明に設定されていれば、Erlang ioシステムでこれを特別に処理する必要はありません。

+0

華麗な説明。ありがとうございました。 –

+0

Erlang:display/1は、Erlang I/Oがどのように動作するかを実証するのに最適です。表示や書式のあるリモートノードでrpcを使用している正確な例は、トレーニングセッションで使用したものです。 :-) – RichardC

+0

@リチャードCあなたは真っ直ぐにstdoutに書き込むこととErlang ioを使うことの違いを意味しますか? – rvirding

関連する問題