Introducción El reloj sirve para medir el paso del tiempo Tick: Unidad del tiempo El número de ticks por segundo se puede conocer con sysconf (_SC_CLK_TCK) Resolución: Mínimo intervalo de tiempo que un reloj puede medir La Época: CUT (Coordinated Universal Time) 0 h 0 m 0s del 1 de enero de 1970
Introducción Temporizador Es un objeto que puede avisar a los procesos si ha transcurrido cierta cantidad de tiempo o se ha alcanzado cierta hora Cada temporizador está asociado a un reloj Reloj del sistema Mide los segundos desde La Época Mantiene la hora Reloj de tiempo real Se usa para timeouts y temporizadores
Reloj del sistema Leer la hora: #include time_t time (time_t *t); time() devuelve los segundos transcurridos desde La Época Si t es distinto de NULL en él se devuelve la hora también Alarma: #include unsigned int alarm (unsigned int seconds); Cuando transcurren los segundos especificados se envía la señal SIGALRM
Ejemplo #include #include #include #include
void manejador (int senal) { time_t seg; printf (“Recibida la señal de alarma … n”); seg = time (NULL); printf (“Segundos desde La Época: %dn”, seg); exit (0); }
Ejemplo (continuación) main() { struct sigaction accion; time_t seg; accion.sa_flags = 0; accion.sa_handler = manejador; sigemptyset (&accion.sa_mask); sigaction (SIGALRM, &accion, NULL); seg = time (NULL); printf (“Segundos desde La Época: %dn”, seg); alarm (3); while (1); } /* Fin de main */
Reloj de tiempo real La estructura timespec: typedef struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ } timespec_t;
Tiempo = tv_sec * 109 + tv_nsec
Manejo de relojes Cambio de hora: #include int clock_settime(clockid_t clock_id, const struct timespec *tp); Obtención de la hora: int clock_gettime(clockid_t clock_id, struct timespec *tp); Resolución del reloj: int clock_getres(clockid_t clock_id, struct timespec *res); clockid_t debe valer CLOCK_REALTIME para TR
Ejemplo #include
main() { struct timespec stime; clock_getres (CLOCK_REALTIME, &stime); printf (“Segundos: %dn”, stime.tv_sec); printf (“Nanosegundos: %ldn”, stime.tv_nsec); } /* Fin de main */
Temporizadores Se utilizan para generar señales en ciertos momentos o para ejecutar acciones periódicas ¿Cómo crear un temporizador? #include #include timer_create(clockid_t clock_id,struct sigevent *evp, timer_t *timerid); sigevent indica el modo de aviso: ninguno, señal o crear y ejecutar un hilo timerid es el identificador devuelto El temporizador inicialmente no está activo
Temporizadores ¿Cómo borrar un temporizador? timer_delete (timer_t timerid); ¿Cómo activar un temporizador? int timer_settime (timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); Estructura itimerspec: it_interval: periodo it_value: tiempo de expiración Si it_value vale 0 el temporizador es desactivado Si it_value > 0 el temporizador se activa en el instante especificado
Temporizadores Si el temporizador ya estaba activado, se reactiva flag indica si el temporizador es absoluto o relativo Si flag = TIMER_ABSTIME, la primera expiración será cuando el reloj valga it_value Si no se especifica nada, se espera hasta empezar el tiempo definido en it_value ¿Cómo leer el valor de un temporizador? int timer_gettime (timer_t timerid, struct itimerspec *value);
Ejemplo #include #include
void manejador(int senal) { struct timespec stime; clock_gettime (CLOCK_REALTIME, &stime); printf (“Repeticion -> Segundos: %dt”, stime.tv_sec); printf (“Nanosegundos: %ldn”, stime.tv_nsec); } /* Fin de manejador */
Ejemplo main() { struct sigaction accion; struct sigevent evento; timer_t idtemp; struct itimerspec itspec; struct timespec stime; accion.sa_flags = 0; accion.sa_handler = manejador; sigemptyset (&accion.sa_mask); sigaction (SIGUSR1, &accion, NULL); evento.sigev_signo = SIGUSR1; evento.sigev_notify = SIGEV_SIGNAL;
Ejemplo timer_create(CLOCK_REALTIME, &evento,&idtemp); itspec.it_value.tv_sec=5;/*Activación en 5 s*/ itspec.it_value.tv_nsec = 0; itspec.it_interval.tv_sec = 1; itspec.it_interval.tv_nsec = 0; timer_settime (idtemp, 0, &itspec, NULL); clock_gettime (CLOCK_REALTIME, &stime); printf (“Comienzo -> Segundos: %dt”, stime.tv_sec); printf (“Nanosegundos: %ldn”, stime.tv_nsec); while(1); } /* Fin de main */
Ejecución Comienzo -> Segundos: 921550145 Nanosegundos: 828803000 Repetición -> Segundos: 921550150 Nanosegundos: 828918000 Repetición -> Segundos: 921550151 Nanosegundos: 828883000 Repetición -> Segundos: 921550152 Nanosegundos: 828877000 Repetición -> Segundos: 921550153 Nanosegundos: 828891000 Repetición -> Segundos: 921550154 Nanosegundos: 828876000 Repetición -> Segundos: 921550155 Nanosegundos: 828876000 Repetición -> Segundos: 921550156 Nanosegundos: 828877000 Repetición -> Segundos: 921550157 Nanosegundos: 828878000 Repetición -> Segundos: 921550158 Nanosegundos: 828894000 Repetición -> Segundos: 921550159 Nanosegundos: 828880000 Repetición -> Segundos: 921550160 Nanosegundos: 828885000
sleep() Se emplea para dormir a un proceso o a un hilo hasta que transcurran lo segundos especificados unsigned int sleep (unsigned int seconds); Existe un sleep() de alta resolución int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); Con nanosleep() se duerme hasta que transcurre el intervalo especificado o hasta que se recibe una señal rqtp es el tiempo que vamos a dormir rmtp es el tiempo que falta por dormir si se retorna por la activación de una señal
Página siguiente |