catch link(Pid) when trapping exits

Raimo Niskanen <>
Thu Oct 27 11:43:57 CEST 2005


Raimo Niskanen <> writes:

Alright, that was only almost right:

link(Pid) -> error(noproc) if Pid is local and does not exist and
                           caller has process_flag(trap_exit, false)
             true          otherwise

And if the Pid dies, or even was remote and did not exist
(those cases can not be discriminated), the caller will get
an exit signal that can be converted to a regular message
with process_flag(trap_exit, true).

Let us see how long this explanation holds together...

>  (Francesco Cesarini Erlang Training & Consulting) writes:
> 
> > In a process trapping exists,
> > 
> > catch link(Pid)
> > 
> > of a non existing pid returns true. If we are not trapping exists, the
> > return value is {'EXIT', {noproc, .....}}
> > 
> 
> From erl -man erlang:
> 
>     link(Pid) -> true
> 
>           Types
>                Pid = pid() | port()
> 
>           Creates a link between the calling process and  another
>           process  (or  port)  Pid,  if  there is not such a link
>           already. If a process attempts  to  create  a  link  to
>           itself, nothing is done. Returns true.
> 
>           Does not fail, but sends an  exit  signal  with  reason
>           noproc  to  the  calling process if Pid does not exist.
>           This means that, unless the calling process is trapping
>           exits (see process_flag/2), it will exit if it tries to
>           link to a non-existing process.
> 
> It is all there, really. Only it was written before exceptions
> were invented as a concept in Erlang, uses the term
> "exit signal" in a confusing way and lies about "does not fail".
> Ok, it is maybe dead wrong, but the intention was right.
> So, what happens is:
> 
> link(Pid) -> true           if Pid exists or the caller has
>                             process_flag(trap_exit, true).
>              error(noproc)  otherwise
> 
> The enclosing catch evaluates to {'EXIT',{noproc,Stackdump}}
> for error(noproc).             
> 
> Weird behaviour, in my opinion..
> 
> > Looking into this "feature", my guess is that executing exit(Pid,
> > Reason) when trapping exists returns true. I would however expect the
> > same behavior in both cases, however....
> > 
> > 11> catch exit(hello).
> > {'EXIT',hello}
> > 12> catch exit(self(), hello).
> > true
> > 13> flush().
> > Shell got {'EXIT',<0.44.0>,hello}
> > ok
> > 
> > Is this a bug or a feature?
> > 
> 
> This is a feature.
> 
> exit/1 causes an exception of class 'exit' in the calling process,
>        which when enclosed in a catch evaluates to
>        {'EXIT',Reason} - no stacktrace since it is of class 'exit'.
> 
> exit/2 sends an exit signal to the target process. And if
>        the target process (self()) traps exits, it becomes
>        a regular message.
> 
> > Francesco
> > --
> > http://www.erlang-consulting.com
> > 
> 
> -- 
> 
> / Raimo Niskanen, Erlang/OTP, Ericsson AB

-- 

/ Raimo Niskanen, Erlang/OTP, Ericsson AB



More information about the erlang-questions mailing list