concurrency - Can I catch an external exit in Erlang? -


i have 2 processes linked; let's they're a , b, a set trap exits. want able recover piece of b's process data if calls exit/2 on it, e.g. exit(b, diediedie).

in b's module, let's call bmod.erl, have code looks this:

-module(bmod). -export([b_start/2]).  b_start(a, x) ->     spawn(fun() -> b_main(a, x) end).  b_main(a, x) ->       try         ! {self(), doing_stuff},         do_stuff()       catch         exit:_ -> exit({terminated, x})       end,       b_main(a, x).  do_stuff() -> io:format("doing stuff.~n",[]). 

and in a's module, let's call amod.erl, have code looks this:

-module(amod). -export([a_start/0]).  a_start() ->   process_flag(trap_exit, true),   link(bmod:b_start(self(), some_stuff_to_do)),   a_main().  a_main() ->   receive     {pid, doing_stuff} ->       io:format("process ~p did stuff.~n",[pid]),       exit(pid, diediedie),       a_main();     {'exit', pid, {terminated, x}} ->       io:format("process ~p terminated, had ~p.~n", [pid,x]),       fine;     {'exit', pid, _reason} ->       io:format("process ~p terminated, can't find had.~n", [pid]),       woops   end. 

(i realize should spawn_link in original program there code in between spawn , link, , modeled example code way.)

now when run code, this.

2> c(amod). {ok,amod} 3> c(bmod). {ok,bmod} 4> amod:a_start(). doing stuff. process <0.44.0> did stuff. doing stuff. process <0.44.0> did stuff. process <0.44.0> terminated, can't find had. woops 5>  

how b_main() catch external exit can report state x?

for b_main() catch external exit, has trap exit calling process_flag(trap_exit, true). result in message process can exit state x. code below

b_start(a, x) ->     spawn(fun() -> process_flag(trap_exit, true), b_main(a, x) end).  b_main(a, x) ->     try         ! {self(), doing_stuff},         do_stuff()     catch         exit:_ ->              io:format("exit inside do_stuff() . ~n"),             exit({terminated, x})     end,      receive         {'exit',pid, reason} ->             io:format("process received exit ~p ~p.~n",[pid, reason]),             exit({terminated, x})     after 0 ->             ok     end,     b_main(a, x). 

Comments

Popular posts from this blog

c# - Send Image in Json : 400 Bad request -

jquery - Fancybox - apply a function to several elements -

An easy way to program an Android keyboard layout app -