Re: Strange behaviour of exit(kill)
Soup <[email protected]> Tue, 6 Oct 2015 21:20:13 -0400
| Newsgroups | gmane.comp.lang.erlang.bugs,gmane.comp.lang.erlang.general |
|---|---|
| Message-ID | <CAJu7ntwN6P6VacxOUKX0TW8ss=LuzCV6+au7zfUyJapBP1QuZQ@mail.gmail.com> |
At 9, the spawned process is killing itself with reason kill, and the shell received a trappable exit message. At 11, the spawned process is killing the *shell* with reason kill. That's not a trappable signal coming from another process: it's an emulator command to kill the specified process, and the reason kill makes it untrappable. It's a little nuanced, but pretty straightforward otherwise. When a process dies, it informs linked processes by way of message, which forces exit unless the receiving process is trapping exits. *exit/2 does not produce a message*, it tries to terminate the process. It's only converted into a message if the process is trapping exits, and reason kill bypasses the trapping logic. On Oct 6, 2015 9:00 PM, "Robert Virding" <[email protected]> wrote: > I am giving an Erlang course and we are looking at the error handling. > When showing examples I found a very strange behaviour (to me) of doing > exit(kill). The linked process gets the 'kill' but it is trappable. > However, if I use exit(P, kill) to send the kill signal it is, as it should > be, not trappable. > > Erlang/OTP 18 [erts-7.0] [source-4d83b58] [64-bit] [smp:8:8] > [async-threads:10] [hipe] [kernel-poll:false] > > Eshell V7.0 (abort with ^G) > 1> process_flag(trap_exit, true). > false > 2> spawn_link(fun () -> exit(normal) end). > <0.36.0> > 3> flush(). > Shell got {'EXIT',<0.36.0>,normal} > ok > 4> spawn_link(fun () -> exit(die) end). > <0.39.0> > 5> flush(). > Shell got {'EXIT',<0.39.0>,die} > ok > 6> S = self(). > <0.33.0> > 7> spawn_link(fun () -> exit(S, die) end). > <0.43.0> > 8> flush(). > Shell got {'EXIT',<0.43.0>,die} > Shell got {'EXIT',<0.43.0>,normal} > ok > 9> spawn_link(fun () -> exit(kill) end). > <0.46.0> > 10> flush(). > Shell got {'EXIT',<0.46.0>,kill} > ok > 11> spawn_link(fun () -> exit(S, kill) end). > ** exception exit: killed > > The shell evaluator process traps exits and then spawn_links a number of > processes which exit/1 and exit/2 with different reasons. Everything > behaves normally until 9> where I spawn_link a process which does an > exit(kill). I get the 'kill' signal, but it is a trappable 'kill' signal! > If I send the 'kill' signal with exit/2 it is not trappable, as it > shouldn't be. > > What gives? So just receiving a 'kill' signal is not what kills me but it > has to be sent in a certain way. So the process receiving a signal knows > how the signal was sent. This is really inconsistent! It should be the > signal itself which determines what the receiving process does. I would > definitely class this as a bug. > > Robert > > > _______________________________________________ > erlang-bugs mailing list > [email protected] > http://erlang.org/mailman/listinfo/erlang-bugs > > _______________________________________________ erlang-bugs mailing list [email protected] http://erlang.org/mailman/listinfo/erlang-bugs