[erlang-questions] Programming question

Ladislav Lenart lenartlad@REDACTED
Wed Jan 24 15:28:02 CET 2007


Sean Hinde wrote:
> Hi,
> 
> A quick question for Erlang gurus out there.
> 
> I have two processes A and B. B spends most of its life in a series  
> of gen_server calls towards A:
> 
> loopB(PidA, S) ->
>       Res = gen_server:call(PidA, {op, stuff}),
>       S1 = process(Res, S),
>       loopB(PidA, S1).
> 
> The question is how do I set things up so that if A dies B is killed?

I am not a guru, but if "to die" means to terminate abnormally,
you can link the two processes. BUT since links are bi-directional,
if B dies, A will be killed as well.

If this is not what you want, you can either start trapping exit
signals OR you might take a look at erlang:monitor. It should
allow you to create one-directional link. Modify B as follows:
   * Create a monitor to process A (during initialization perhaps)
     and store the resulting reference (Ref) as part of B's internal
     state.
   * Modify loopB so it can receive the following message:
       {'DOWN', Ref, process, PidA, Info}
     where Info is either the exit reason, noproc or noconnection.
     You can terminate the process when this message is received.

BTW I have a question too. If B is implemented in terms of
gen_server, I have to implement handle_info callback function
in order to react upon receive of a 'DOWN' message from the
monitor, right?

Hope this helps,

Ladislav Lenart





More information about the erlang-questions mailing list