[erlang-questions] Programming question

Sean Hinde <>
Wed Jan 24 16:10:20 CET 2007


On 24 Jan 2007, at 14:28, Ladislav Lenart wrote:

> 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.

This won't do it. If A dies while processing the call from B, even  
when linked, then B does not die.

>
> 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}

You will notice that B does not have a receive statement of its own.  
It is relying on gen_server, so this will not help.

>      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?

Yes, that would be the thing to do. OTP behaviours are pretty  
strightforward once you get you head around them

Sean






More information about the erlang-questions mailing list