ここからの短いコピー:
exit(Pid, Reason) -> true
タイプ:
Pid=
pid()
理由=term()
終了理由を含む終了信号を
Reason
プロセスに送信しますPid
。次の動作は、理由がまたは以外の用語である場合に適用され
normal
ますkill
。
Pid
が出口をトラップしていない場合、Pid
それ自体が出口理由で終了しますReason
。が出口をトラップしている場合Pid
、出口信号はメッセージに変換され{'EXIT', From, Reason}
、のメッセージキューに配信されますPid
。From
終了信号を送信したプロセスのpidです。も参照してくださいprocess_flag/2
。
Reason
がアトムの場合normal
、Pid
終了しません。出口をトラップしている場合、出口信号はメッセージに変換され、{'EXIT', From, normal}
そのメッセージキューに配信されます。
Reason
がアトムの場合kill
、つまりexit(Pid, kill)
が呼び出された場合、トラップできない終了信号が送信されPid
、終了理由で無条件に終了しますkilled
。
として使用した場合のexit/2
関数とその動作を試してみました。self()
Pid
normal
Reason
Erlang R15B03 (erts-5.9.3) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.9.3 (abort with ^G)
1> self().
<0.32.0>
2> exit(self(), normal).
** exception exit: normal
3> self().
<0.35.0>
「通常の」終了メッセージのみがシェルプロセスに送信されるので、終了する理由がないというのは事実ではないでしょうか。
同様に:
4> spawn(fun() -> receive Pid -> Pid ! ok end end).
<0.38.0>
5> exit(v(4), normal).
true
6> v(4) ! self().
<0.35.0>
7> flush().
Shell got ok
ok
だが:
8> spawn(fun() -> exit(self(), normal), receive _ -> ok end end).
<0.43.0>
9> is_process_alive(v(8)).
false