catch link(Pid) when trapping exits

Robert Virding <>
Fri Oct 28 00:58:22 CEST 2005


No, no, no it should definitely NOT return error(noproc).

The reason is that the whole process communication mechanism, including 
links, was originally designed to be asynchronous on the sending side. 
Sending a message is asychronous, ou don't wait in the send to find out 
if it arrived. Link/1 works the same way. The call does not wait until 
the link is set up but just sends the request and continues. If the 
process does not exist the caller is notified by a noproc exit signal 
from the non-existent process (yes I know but from who else could it 
receive it?).

The important point is that in bothe cases the call is asynchronous. 
This also means, mostly importantly, that both calls function the same 
way irrespective of whether the other process is local or remote. This 
was also an original goal.

If this has significantly changed since then then someone has missed the 
original intentions.

Robert


Francesco Cesarini (Erlang Training & Consulting) wrote:

>> 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..
>
>
> Exactly my point. Would it not be better to return error(noproc) even 
> if trapping exits instead of exit(Pid, Reason)?
>
> Francesco
> -- 
> http://www.erlang-consulting.com
>
>



More information about the erlang-questions mailing list