nastaveni timeoutu pro connect()

Michael Mraka Michael.Mraka na GTSgroup.cz
Čtvrtek Duben 26 09:43:08 CEST 2001


Ing. Pavel PaJaSoft Janousek wrote:
% > Jeste to jde udelat pres alarm()?
% 
% 	IMHO hodne spinave a vlastne nesmyslne reseni...(i kdyz trivialni na
% implementaci).

Proc nesmyslne? Takhle to fungovalo v dobe _kdyz_jsem_zacinal_programovat_
:), takze chapu, ze to neni podle nejmodernejsich prirucek.

% > oldalarm = signal(SIGALRM, abort_connect);
% > alarm(timeout);
% !!!!!!
% > if (connect(sock, (struct sockaddr *)&s, sizeof(s)) < 0) {
% >         not_connected();
% > }
% > alarm(0);
% > signal(SIGALRM, oldalarm);
% 
% 	Ftip je v tom, ze tam kde jsou '!!!!' neni zaruceno NICIM, ze alarm a
% connect pujdou po sobe, predstavte si, ze mate vytizeny system nebo ze
% se spozdi nejaka I/O HW operace... skocite do obsluhy signalu jeste
% drive nez jste se vubec o connect pokusili... - rozhodne doporucuji
% ciste reseni, tedy non-blocking sockety apod.

Ano, to skutecne zaruceno neni. Ale neni problem to osetrit tak, aby se
connect() - v pripade, ze obsluha alarmu byla zavolana drive - vubec
neprovadel. Je pravdou, ze pak to bude mit zrejme trochu jinou semantiku, nez
chtel puvodni tazatel.


--mm                                                            Michael Mráka



Další informace o konferenci Linux