讨论
当进程收到了一个“原因”不是normal的信号,默认行为是终止自己,并通知与它相连接的进程(见第??节)。通过使用连接和捕捉EXIT信号建立一个分层的系统是不难的。在这个系统最顶层的进程(应用进程)并不捕获EXIT信号。具有依赖关系的进程相互连接。底层进程(操作系统进程)捕获EXIT并且和需要监视的应用进程(见图8.2)建立连接。使用这种操作系统结构的例子是交换机服务器和电话应用程序,将在第??章讲述,第??章是它们的文件系统。
一个因为EXIT信号导致异常的应用进程,将会把信号发送给所有跟它处在通一进程集内的进程,因此整个进程集都会被杀死。连接到该进程集内应用程序的操作系统进程也会收到EXIT信号,并且会做一些清理工作,也可能重启进程集。
程序 8.2
- loop(Processes) ->
- receive
- {From, {new_proc, Mod, Func, Args}} ->
- Id = spawn_link(Mod, Func, Args),
- From ! {keep_alive, started},
- loop([{Id, Mod, Func, Args}|Processes]);
- {'EXIT', Id, _} ->
- case lists:keysearch(Id, 1, Processes) of
- false ->
- loop(Processes);
- {value, {Id, Mod, Func, Args}} ->
- P = lists:delete({Id,Mod,Func,Args},
- Processes),
- Id1 = spawn_link(Mod, Func, Args),
- loop([{Id1, Mod, Func, Args} | P])
- end
- end.
- new_process(Mod, Func, Args) ->
- keep_alive ! {self(), {new_proc, Mod, Func, Args}},
- receive
- {keep_alive, started} ->
- true
- end.
图8.2 操作系统和应用程序进程
脚注
[1] | 即数字0到9和*以及#。 |
[2] | 这可能是一个好的编程练习,因为它将强制程序的编写者更正这些错误。 |