来自这里的简短副本:
exit(Pid, Reason) -> true
类型:
Pid =
pid()
原因 =term()
Reason
向进程发送带有退出原因的退出信号Pid
。
normal
如果 Reason 是除or之外的任何术语,则以下行为适用kill
:如果
Pid
is not trapping exits,Pid
它本身会以 exit reason 退出Reason
。如果Pid
是捕获出口,则出口信号被转换为消息{'EXIT', From, Reason}
并传递到 的消息队列中Pid
。From
是发送退出信号的进程的 pid。另请参阅process_flag/2
。如果
Reason
是 atomnormal
,Pid
则不会退出。如果它正在捕获出口,则出口信号将转换为消息{'EXIT', From, normal}
并传递到其消息队列。If
Reason
是 atomkill
,即 ifexit(Pid, kill)
被调用,将发送一个不可捕获的退出信号,该信号Pid
将无条件退出并带有 exit reasonkilled
。
当用作 a和as a时,我正在玩弄该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>
不应该是只向shell进程发送“正常”退出消息,所以没有理由退出吗?
相似地:
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