0

編集:私が犯したn00bの間違いに照らして役に立たなかったため、この質問のタイトルを変更しました。残りは変更されておらず、警告として役立ちます!

Erlang OTP バージョン 17.4 を使用しています。「Learn You Some Erlang:Errors and Processes」trap_exitで説明されているように、プロセス フラグを試している次の Erlang シェル セッションについて考えてみましょう。

まず、trap_exitリンクされたプロセスの終了シグナルを通常のメッセージに変換するフラグを設定します。

Eshell V6.2  (abort with ^G)
1> process_flag(trap_exit, true).
false

次に、リンクされたプロセスを生成し、次の呼び出しですぐに終了しますexit/2

2> exit(spawn_link(fun() -> timer:sleep(50000) end), kill).
true

次に、変換された終了メッセージを読みます。

3> receive X -> X end.
{'EXIT',<0.61.0>,killed}

本が説明しているように、これまでのところすべて順調に見えます。さて、楽しみのために、spawn_link別のプロセスを終了します。

4> exit(spawn_link(fun() -> timer:sleep(5000) end), kill).
true

そして、変換された終了メッセージを読んでみてください:

5> receive X -> X end.

この時点で、シェルがハングします。私の質問は、なぜ 2 回目の動作が変わるのか、終了メッセージはどこに行ったのかということです。

4

1 に答える 1

3

あなたの秒receive X -> X end.はすでにXバインドされています。すでに見たものと完全に一致するメッセージを受信しようとしています。pid が異なるため、メッセージが一致することはありません。そのため、一致するものを待ってハングします。

f(X)最初にする必要があります。

于 2014-12-30T11:31:10.333 に答える