Descargar

POSIX – Relojes y temporizadores

Enviado por Pablo Turmero


Partes: 1, 2, 3

    edu.red

    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

    edu.red

    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

    edu.red

    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

    edu.red

    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); }

    edu.red

    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 */

    edu.red

    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

    edu.red

    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

    edu.red

    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 */

    edu.red

    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

    edu.red

    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

    edu.red

    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);

    edu.red

    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 */

    edu.red

    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;

    edu.red

    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 */

    edu.red

    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

    edu.red

    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

    Partes: 1, 2, 3
    Página siguiente