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 |