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