• Viernes 29 de Marzo de 2024, 10:08

Autor Tema:  Problemas con setitimer...  (Leído 2738 veces)

lestat_l

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Problemas con setitimer...
« en: Viernes 15 de Febrero de 2002, 02:54 »
0
Salu2:

Tengo un problema con el siguiente código:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netdb.h>
#include <sys/time.h>
#include <signal.h>
#include <setjmp.h>
#include <string.h>
#include <stdio.h>

jmp_buf env;

void sigalarm_handler(){
  printf("Aquí estoyn");
  longjmp(env,1);
}

int main(int argc,char *argv[]){
  struct itimerval temporizador,temporizador_ant,temp;
  int i=0;

  signal(SIGALRM,sigalarm_handler);
  temporizador.it_value.tv_sec=0;
  temporizador.it_value.tv_usec=10000;
  temporizador.it_interval.tv_sec=0;
  temporizador.it_interval.tv_usec=0;

  while(i<3){
    i++;
    printf("LLEGO AQUï E I VALE %dn",i);
    if(setjmp(env)==0){
      if(signal(SIGALRM,sigalarm_handler)==SIG_ERR)
        printf("Ha habido un error al armar el manejador.n");
      printf("El valor de segundos del temporizador es: %d",temporizador.it_value.tv_sec);
      printf("El valor de microsegundos del temporizador es: %d",temporizador.it_value.tv_usec);
      printf("El valor de segundos del intervalo del temporizador es: %d",temporizador.it_interval.tv_sec);
      printf("El valor de microsegundos del intervalo del temporizador es: %d",temporizador.it_interval.tv_usec);
      temporizador.it_value.tv_sec=0;
      temporizador.it_value.tv_usec=100000;
      temporizador.it_interval.tv_sec=0;
      temporizador.it_interval.tv_usec=0;
      if(setitimer(ITIMER_REAL,&temporizador,&temporizador_ant)!=0){
        perror("setitimer");
        exit(1);
      }
      do{
        getitimer(ITIMER_REAL,&temp);
        printf("Segundos en Value: %in",temp.it_value.tv_sec);
        printf("Microsegundos en Value: %in",temp.it_value.tv_usec);
        printf("Segundos en Interval: %in",temp.it_interval.tv_sec);
        printf("Microsegundos en Interval: %in",temp.it_interval.tv_usec);
      }while(1);
    }
    else{
      printf("Salgo...");
      if(signal(SIGALRM,sigalarm_handler)==SIG_ERR)
        printf("JARLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLn");
      temporizador.it_value.tv_sec=0;
      temporizador.it_value.tv_usec=0;
      temporizador.it_interval.tv_sec=0;
      temporizador.it_interval.tv_usec=0;
      if(setitimer(ITIMER_REAL,&temporizador,&temporizador_ant)!=0){
        perror("setitimer");
        exit(1);
      }
    }
  }
}

La idea es ejecutar una parte del código durante un cierto tiempo (con precisión de milisegundos, para lo que me hace falta setitimer en lugar de alarm). Si en ese tiempo no se ha ejecutado, se debe ejecutar otra parte del código, y se debe volver a la primera parte de código hasta que acabe el procesamiento en cuestión. Mi problema es que lo hace bien la primera vez, pero a la segunda se queda en el bucle infinito que le he puesto, cuando lo que debería hacer al llegar a 0 el temporizador es saltar a la otra parte del código. He probado a armar el manejador de señales en todos los sitios posibles, a cancelar el temporizador y luego volver a ponerle, etc..., y sigue igual. Vamos, que me estoy volviendo loco. Si alguien tiene alguna idea sobre cómo arreglarlo, por favor, me eche una mano, please... ;-)

Muchas gracias.