<div dir="ltr">Hi Craig,<div><br></div><div>Without the io:formats, the main process kills the chidren before they manage to get executed. Try adding "receive after 3000 -> ok end" before killing the children.</div><div><br></div><div>regards,</div><div>Vlad</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Oct 5, 2014 at 5:00 PM, zxq9 <span dir="ltr"><<a href="mailto:zxq9@zxq9.com" target="_blank">zxq9@zxq9.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I wrote a toy broadcast to pid example today with R17, and in it I had the<br>
spawned processes output with io:format/2 instead of returning a message to<br>
the caller. It turns out, though, that unless the caller prints to stdout<br>
after the subordinates should have executed their own io call nothing is<br>
displayed if this is run in the shell (I haven't tried it as a script).<br>
<br>
Here is a sample:<br>
<br>
% Elementary broadcasting.<br>
-module(bcast).<br>
-export([start/0]).<br>
<br>
start() -><br>
    Pids = [spawn(fun() -> listener() end) || _ <- lists:seq(1,3)],<br>
    Message = "This is my message.",<br>
    ok = bcast(Pids, Message),<br>
    io:format("~p ~p: Weirdly initiates the first batch of messages.~n",<br>
              [self(), now()]),<br>
    io:format("~p ~p: Initiates the second batch.~n",<br>
              [self(), now()]),<br>
    [exit(P, kill) || P <- Pids],<br>
    ok.<br>
<br>
listener() -><br>
    receive<br>
        {bcast, Message} -><br>
            Now = now(),<br>
            io:format(user, "~p: ~p~n", [self(), Now]),<br>
            io:format(user, "~p ~p: Received: ~p~n", [self(), now(),<br>
Message]),<br>
            listener()<br>
    end.<br>
<br>
bcast(Pids, Message) -><br>
    [P ! {bcast, Message} || P <- Pids],<br>
    ok.<br>
<br>
And in the shell:<br>
<br>
24> c(bcast).<br>
{ok,bcast}<br>
25> bcast:start().<br>
<0.138.0>: {1412,520755,828598}<br>
<0.33.0> {1412,520755,828584}: Weirdly initiates the first batch of messages.<br>
<0.139.0>: {1412,520755,828682}<br>
<0.140.0>: {1412,520755,828690}<br>
<0.138.0> {1412,520755,828803}: Received: "This is my message."<br>
<0.33.0> {1412,520755,828812}: Initiates the second batch.<br>
<0.139.0> {1412,520755,828815}: Received: "This is my message."<br>
<0.140.0> {1412,520755,828845}: Received: "This is my message."<br>
ok<br>
26> bcast:start().<br>
<0.33.0> {1412,520757,650460}: Weirdly initiates the first batch of messages.<br>
<0.142.0>: {1412,520757,650474}<br>
<0.143.0>: {1412,520757,650482}<br>
<0.144.0>: {1412,520757,650486}<br>
<0.33.0> {1412,520757,650656}: Initiates the second batch.<br>
<0.142.0> {1412,520757,650665}: Received: "This is my message."<br>
<0.143.0> {1412,520757,650671}: Received: "This is my message."<br>
<0.144.0> {1412,520757,650676}: Received: "This is my message."<br>
ok<br>
<br>
The two io:format/2 calls in start/0 appear to be necessary to permit the<br>
subordinates to access stdout. If I comment out one, then only the first<br>
subordinate process' io:format/2 is displayed, if I comment out both<br>
bcast:start/0 quietly returns 'ok'. Even more weird, though, is that the<br>
timestamps demonstrate that the calls to now/0 are happening after start/0's<br>
calls to io -- which seems very odd.<br>
<br>
What is happening here? I understand the group leader thing with stdout (at<br>
least I think I do -- this is all on a single, local node, anyway), but am<br>
puzzled at this behavior.<br>
<br>
Regards,<br>
-Craig<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div><br></div>