• 讨论

    讨论

    当进程收到了一个“原因”不是normal的信号,默认行为是终止自己,并通知与它相连接的进程(见第??节)。通过使用连接和捕捉EXIT信号建立一个分层的系统是不难的。在这个系统最顶层的进程(应用进程)并不捕获EXIT信号。具有依赖关系的进程相互连接。底层进程(操作系统进程)捕获EXIT并且和需要监视的应用进程(见图8.2)建立连接。使用这种操作系统结构的例子是交换机服务器和电话应用程序,将在第??章讲述,第??章是它们的文件系统。

    一个因为EXIT信号导致异常的应用进程,将会把信号发送给所有跟它处在通一进程集内的进程,因此整个进程集都会被杀死。连接到该进程集内应用程序的操作系统进程也会收到EXIT信号,并且会做一些清理工作,也可能重启进程集。

    程序 8.2

    1. loop(Processes) ->
    2. receive
    3. {From, {new_proc, Mod, Func, Args}} ->
    4. Id = spawn_link(Mod, Func, Args),
    5. From ! {keep_alive, started},
    6. loop([{Id, Mod, Func, Args}|Processes]);
    7. {'EXIT', Id, _} ->
    8. case lists:keysearch(Id, 1, Processes) of
    9. false ->
    10. loop(Processes);
    11. {value, {Id, Mod, Func, Args}} ->
    12. P = lists:delete({Id,Mod,Func,Args},
    13. Processes),
    14. Id1 = spawn_link(Mod, Func, Args),
    15. loop([{Id1, Mod, Func, Args} | P])
    16. end
    17. end.
    18.  
    19. new_process(Mod, Func, Args) ->
    20. keep_alive ! {self(), {new_proc, Mod, Func, Args}},
    21. receive
    22. {keep_alive, started} ->
    23. true
    24. end.

    _images/8.2.png图8.2 操作系统和应用程序进程

    脚注

    [1]即数字09*以及#
    [2]这可能是一个好的编程练习,因为它将强制程序的编写者更正这些错误。