Odblokovani procesu
Jaroslav Honsa
honsa na sunstel.asu.cas.cz
Pátek Květen 12 11:54:16 CEST 2000
On Thu, 11 May 2000, Pavel Kankovsky wrote:
> alarm() udela to, ze za stanoveny pocet sekund (je-li zadano nenulove
> cislo, ze ano), dostane proces SIGALRM. Pokud jeho ovladac nema nastaveno
> SA_RESTART (viz sigaction(2)), tak se LIBOVOLNY probihajici syscall
> prerusi s chybou EINTR. Pokud Vam to nefunguje, pak asi delate neco
> spatne.
>
Dobry den znovu.
Situace se mi nejak zkomplikovala. Pouzil jsem select podle rady Petra
Novotneho, ale kdyz prerusim spojeni, socket zustane zablokovany nebo co a
pise mi to porad timeout. Kod vypada takhle:
while (1) {
if (sendto(sockfd, &ch, 1, 0, (struct sockaddr *) &serv_address,
sizeof(serv_address)) < 0) {
perror("Chyba sendto\n");
}
timeout.tv_sec = 1;
timeout.tv_usec = 0;
result = select(FD_SETSIZE, &input, (fd_set *)0, (fd_set*)0, &timeout);
switch(result) {
case 0:
printf("timeout\n");
break;
case -1:
perror("Chyba selectu");
break;
default:
n = recvfrom(sockfd, &ccd_data, sizeof(ccd_data), 0, (struct sockaddr
*) 0, (int *) 0);
if (n < 0) {
perror("Nejde vubec spojeni");
}
... zpracovani dat ze socketu
usleep(500000);
}
---------------------------------------------------
No a varianta s alarmem vypada takhle:
signal(SIGALRM, kdyz_alarm);
tout_flag = 0;
alarm(2);
n = recvfrom(sockfd, &ccd_data, sizeof(ccd_data), 0, (struct sockaddr
*) 0, (int *) 0);
if (n < 0) {
if (tout_flag) {
printf("Vypadek spojeni\n");
} else {
printf("Nejde vubec spojeni\n");
return(-1);
}
}
alarm(0);
... zpracovani dat ze socketu
usleep(500000);
void kdyz_alarm()
{
printf("Nastala chyba prenosu");
tout_flag = 1;
}
Tady v tom propade proces visi na recvfrom a odmita se prerusit alarmem.
Kde je, prosim Vas ta bota?
Ani nemam chut k obedu ...:-(
Diky za pomoc.
Zdravi Jaroslav Honsa.
Další informace o konferenci Linux