[erlang-questions] Strange Socket Behaviour (with spawn) Was:Parents always take children with them?
andrew cooke
andrew@REDACTED
Sun Apr 29 14:30:52 CEST 2007
Thanks. This is very embarrassing / frustrating, because I keep making
mistakes which obscure the "real" problem I am having (to me and everyone
else). So I beg you patience, because I still have a problem (the same
problem that caused me to ask about parent processes, and the same problem
I have in more complex code, which these questions have tried to simplify
in (incorrect) examples).
The following code blocks on the socket read:
-define(BASE_TCP, [list, inet, {packet, raw}, {active, false}]).
start() ->
application:start(sasl),
{ok, A} = inet:getaddr("10.2.0.1", inet),
{ok, P} = gen_tcp:connect(A, 3128, ?BASE_TCP),
% proc_lib:spawn(fun() ->
gen_tcp:controlling_process(P, self()),
io:format("blocking on ~p~n", [P]),
X = gen_tcp:recv(P, 0),
io:format("~p~n", [X]),
io:format("done")
% end)
.
However, if the comments are removed, the read returns {error, closed}
immediately. This happens even if the socket is passed as an argument to
a separate function rather than implicitly via a closure, and closure is
delayed if the "parent" process time:sleep()s (The SASL output looks OK
now - thanks for that tip).
I have added the controlling_process call, since I thought that might be
the problem, but it makes no difference. However, I am now thinking the
root cause is that the outer process "owns" the socket in some way and is
closing it. Is that correct? I suspect so - with the other error mistake
fixed (thanks) this is easier to reason about.
I really hope this is the last time I need to post about this. Sorry
again for the confusion/mistakes.
Andrew
> Ludovic Coquelle writes:
>
> > ... so the normal behavior is that gen_recv doesn't block, which is
> probably
> > intended since you request 0 byte with infinity timeout
>
> More precisely, gen_tcp:recv(P, 0) will block until at least one octet
> of data is available, with the options Andrew is using.
>
> But yes, Andrew's problem is as you diagnosed: his "critical" line of
> code will crash the process because the second argument to io:format
> must be a list.
>
> Matthias
>
>
More information about the erlang-questions
mailing list