behavior of io:format() in spawn'ed process

HP Wei hp@REDACTED
Wed Jun 28 21:40:20 CEST 2006


I am writing a monitoring module whose partial code is appended
at the end of this email.
I would like to ask for help in understanding the behavior of
io:format() in a spawn'ed process.

Suppose there are three nodes.  What the code does is illustrated
in the following.

          node_a             node_b            node_c
stage(1)  migrate()------->  watch_job()
          through spawn_link()
stage(2)                     send_back done
stage(3)                     migrate()-------->watch_job()
                             through spawn_link

The code is compiled and loaded on all three nodes' erl-sehll
(in interactive mode).
The first migrate() call is invoked in node_a's shell window.

Here comes the questions:
   How come the output of io:format() in the first line of the
   function watch_job()
   always gets displayed in the shell-window of node_a ??

   In the above diagram, both watch_job() are not run on
   node_a.  I thought there would be no output on node_a.

   Somehow, the IO is tied to node_a's erl-shell.
   [ If I break the tie (by killing the erl-shell on node_a,
     the code won't work anymore...]

   Am I doing something wrong in the code ?

Thanks,
--hp


-module(wd).

-export([watch_job/2, migrate/1]).

watch_job(Nodes, Calling_pid) ->
    io:format("~p -- calling from ~p~n", [node(), Calling_pid]),
    do_something(), % including re-starting any dead erl.
    % ask the next node to take over
    Calling_pid ! {done, {node(), self()}},
    spawn(?MODULE, migrate, [Nodes]).

...

migrate(Nodes) ->
    process_flag(trap_exit, true),
    Node = next_node(node(), Nodes), % get the next node other than me
    Pid = spawn_link(Node, ?MODULE, watch_job, [Nodes, self()]),
    loop(Pid, Nodes).
...

loop(Pid, Nodes) ->
    receive
	{'EXIT', Pid, noconnection} ->
	    deal_with_it(),
	    % start another migrater
	    spawn(?MODULE, migrate, [Nodes]);
	X ->
	    ok
    end.

...




More information about the erlang-questions mailing list