Краткая копия из здесь:
exit(Pid, Reason) -> true
Типы:
Код =
pid()
Причина =term()
Отправляет сигнал выхода с причиной выхода
Reason
процессуPid
.Следующее поведение применяется, если Reason является любым термином, кроме
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