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