Timeout v unixu

Jan Jirmasek jjir2125 na ss1000.ms.mff.cuni.cz
Neděle Listopad 29 18:36:56 CET 1998


> Ahoj
> Potrebuju udelat program,ktery bude posilat soubory pres UDP, pomoci
> "okenek".Musi se tam udelat timeouty.Ale vubec nemam predstavu,jak ty
> timeouty naprogramovat.Muzete nekdo poradit ? Diky ..


Ahoj,
  snad jedina funkce, kterou budes potrebovat a ktera podporuje timeout je
select(). Jestli ale potrebujes vyresit i timeouty u dalsich fci jako je
connect() a jim podobnych, zkus pouzit fci alarm(), ktera nastavi, ze tvuj
proces dostane za dany pocet sekund signal SIGALRM. Kdyz do te doby funkce
neskonci, provede se funkce obsluhujici signal SIGALRM... viz priklad.


							Jim


Priklad implementace timeoutu pro connect():
--------------------------------------------

jmp_buf env;

void timeout(int sig)
{
  signal(sig, SIG_IGN);

  /* tady muzou bejt najaky dalsi tvoje fce */

  longjmp(env,1);
}

int t_connect(int sockfd, struct sockaddr *serv_addr, int addrlen)
{
  int e;
  void (*oldsig) (int);

  if (setjmp(env)) return(-1);  /* vyprsel timeout */

  alarm(0);
  oldsig = signal(SIGALRM, timeout);
  alarm(SIGALRM, 200);

  e = connect(sockfd, serv_addr, addrlen);

  alarm(0);
  signal(SIGALRM, oldsig);

  return(e);
}


PS: Ve fci timeout se obsluhovani signalu SIGALRM uplne zrusi - takze
jestli budes signal SIGALRM pouzivat treba jako timeout jeste pro jine
fce, musis si to upravit...


------------------------------------------
Jan Jirmasek, student MFF UK 
EMail: jjir2125 na ss1000.ms.mff.cuni.cz
URL: http://www.ms.mff.cuni.cz/~jjir2125/
------------------------------------------



Další informace o konferenci Linux