erlang里面可以使用link来监控其他进程是否死亡。
link是双向的,并且如果多次在两个相同之间调用Link只会有一条link产生。
相连进程如果由某一进程因某种原因而终止,会通过一种叫做信号的特殊消息传递给相连进程,该信号会自动作用于相连进程并杀死它。
通过process_flag(exit_trap,true)可以将进程变为系统进程,从而将退出信号转换成普通的消息。
exit/2函数可以用于杀死其他进程。
有个很有意思的例子:
exit(spawn_link(fun()->timer:sleep(50000) end), kill)
Untrapped Result:** exception exit:killed
Trapped Result:{'EXIT', <0.58.0>, killed}
exit(self(), kill)
Untrapped Result:** exception exit:killed
Trapped Result:** exception exit: killed
spawn_link(fun()-> exit(kill) end)
Untrapped Result:** exception exit:killed
Trapped Result:{'EXIT', <0.67.0>, kill}
我们可以捕获大多数exit,但是对于Kill的话,是无法trap的,因为有些进程可能处于无限的循环中,使用这个机制可以有效的终止他们。我们可以注意到,因为kill消息的缘故,如果接受他的进程没有转换成killed,那么和他相连的进程也会因为Kill消息而终止。
但是要注意的是exit(kill)捕获的消息是kill而不是killed。
除了Link之外,我们也可以使用monitors,主要有两处不同,首先它是单向监控,其次它是可以在两个相同进程之间多次调用的。
每当被监视进程down掉的时候,监视进程的每一个监视都会收到{‘DOWN’, MonitorReference, process, Pid, Reason}消息。