Редактировать: я изменил название этого вопроса, так как это было бесполезно в свете сделанной мной ошибки n00b. Остальное не изменилось и служит предостережением!
Я использую Erlang OTP версии 17.4. Рассмотрим следующий сеанс оболочки Erlang, в котором я экспериментирую с флагом процесса trap_exit
, как описано в "Learn You Some Erlang:Errors и процессы".
Во-первых, я установил флаг trap_exit
, чтобы преобразовать сигналы выхода в связанных процессах в обычные сообщения:
Eshell V6.2 (abort with ^G)
1> process_flag(trap_exit, true).
false
Затем я создаю связанный процесс и немедленно завершаю его вызовом exit/2
:
2> exit(spawn_link(fun() -> timer:sleep(50000) end), kill).
true
Затем я прочитал преобразованное выходное сообщение:
3> receive X -> X end.
{'EXIT',<0.61.0>,killed}
Пока все выглядит хорошо, как описано в книге. Теперь, просто для удовольствия, я spawn_link
завершаю другой процесс:
4> exit(spawn_link(fun() -> timer:sleep(5000) end), kill).
true
И попробуйте прочитать преобразованное выходное сообщение:
5> receive X -> X end.
В этот момент оболочка зависает. Мой вопрос в том, почему поведение меняется при втором обходе и куда делось сообщение о выходе?