編集:私が犯した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 回目の動作が変わるのか、終了メッセージはどこに行ったのかということです。