Monografias.com > Computación
Descargar Imprimir Comentar Ver trabajos relacionados

POSIX – Relojes y temporizadores




Enviado por Pablo Turmero



Partes: 1, 2, 3


    Monografias.com

    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

    Monografias.com

    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

    Monografias.com

    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

    Monografias.com

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

    Monografias.com

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

    Monografias.com

    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

    Monografias.com

    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

    Monografias.com

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

    Monografias.com

    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

    Monografias.com

    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

    Monografias.com

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

    Monografias.com

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

    Monografias.com

    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;

    Monografias.com

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

    Monografias.com

    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

    Monografias.com

    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 

    Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

    Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

    Categorias
    Newsletter