讨论

当进程收到了一个“原因”不是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]这可能是一个好的编程练习,因为它将强制程序的编写者更正这些错误。