gen_tcp return a tuple,<br>so the line marked as critical doesn't help, it may kill the process because X is not a list.<br>(change it to io:format("~p~n", [X]) to see if it's better).<br><br>... so the normal behavior is that gen_recv doesn't block, which is probably intended since you request 0 byte with infinity timeout
<br><br>2 newby cents<br><br><div><span class="gmail_quote">On 4/29/07, <b class="gmail_sendername">andrew cooke</b> <<a href="mailto:andrew@acooke.org">andrew@acooke.org</a>> wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>I was wrong about parent processes, but I now have no explanation for the<br>following.<br><br>-define(BASE_TCP, [list, inet, {packet, raw}, {active, false}]).<br><br>start() -><br>    {ok, A} = inet:getaddr("
<a href="http://10.2.0.1">10.2.0.1</a>", inet),<br>    {ok, P} = gen_tcp:connect(A, 3128, ?BASE_TCP),<br>    spawn(fun() -><br>                  io:format("blocking~n"),<br>                  X = gen_tcp:recv(P, 0),
<br>                  io:format("~p~n", X),  %%% critical<br>                  io:format("done")<br>          end).<br><br>This blocks on recv (as expected).  But if the line marked "critical" is
<br>omitted, then the call does not block ("done" is printed immediately).<br><br>As far as I can tell, Erlang has eager evaluation, and the above is a<br>simplified version of a similar problem in a more complex program where
<br>the same problem occurs (recv fails to block) even though the result is<br>observed (the value {error, closed} was returned).  So I do not understand<br>the behaviour.<br><br>The "spawn" is necessary - without it, the recv blocks whether the
<br>"critical" line is present or not.<br><br>The above was invoked with<br>  emake; erl -noshell +W i -run <module name><br>in Erlang (BEAM) emulator version 5.5.4 [source] [64-bit]<br>[async-threads:0] [hipe]
<br><br>Can someone explain this?  Is it a bug?<br><br>Thanks,<br>Andrew<br><br><br>> Do children processes die when the parent finishes (even normally)?<br>><br>> If so, is there any way to stop this, or do I simply have to arrange that
<br>> the last child is called directly rather than spawned (imagine a parent<br>> spawning a set of children and then exiting)?  Doing this (redirecting the<br>> parent thread "into" the final child) makes my code less symmetric than I
<br>> would like :o)  I would prefer it if a parent could be made to wait for<br>> all children to terminate (if terminating normally).<br><br><br>_______________________________________________<br>erlang-questions mailing list
<br><a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br><a href="http://www.erlang.org/mailman/listinfo/erlang-questions">http://www.erlang.org/mailman/listinfo/erlang-questions</a><br></blockquote>
</div><br>