El uso de temporizadores en Linux.

inserte la descripción de la imagen aquí
En Linux, funciones como timer_create, timer_settimey se pueden utilizar timer_deletepara crear y administrar temporizadores. Aquí hay un programa de ejemplo simple que demuestra cómo usar temporizadores en Linux:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <time.h>

timer_t timerid;

void timer_handler(int signum) {
    
    
    printf("Timer expired!\n");
}

int main() {
    
    
    struct sigevent sev;
    struct itimerspec its;
    struct sigaction sa;

    // 定义定时器处理函数
    sa.sa_flags = SA_SIGINFO;
    sa.sa_sigaction = timer_handler;
    sigemptyset(&sa.sa_mask);
    sigaction(SIGALRM, &sa, NULL);

    // 创建定时器
    sev.sigev_notify = SIGEV_SIGNAL;
    sev.sigev_signo = SIGALRM;
    sev.sigev_value.sival_ptr = &timerid;
    timer_create(CLOCK_REALTIME, &sev, &timerid);

    // 设置定时器
    its.it_value.tv_sec = 5;         // 初始延迟时间(5秒)
    its.it_value.tv_nsec = 0;
    its.it_interval.tv_sec = 2;      // 定时器触发间隔(2秒)
    its.it_interval.tv_nsec = 0;
    timer_settime(timerid, 0, &its, NULL);

    // 等待定时器到期
    while (1) {
    
    
        pause();
    }

    // 删除定时器
    timer_delete(timerid);

    return 0;
}

En este programa de muestra, primero se define una función de procesamiento del temporizador timer_handler, que se utiliza para activarse cuando expira el temporizador. Luego use una función para asociar sigactionla función del controlador del temporizador con la señal.SIGALRM

A continuación, cree una timer_createfunción de uso del temporizador, configure el método de notificación del temporizador en SIGEV_SIGNALy la señal en SIGALRM. Cuando el temporizador expira, se envía una señal SIGALRM.

Luego, utilice timer_settimelas funciones para configurar el tiempo de retardo inicial del temporizador y el intervalo de disparo del temporizador. En el ejemplo anterior, el tiempo de retardo inicial del temporizador es de 5 segundos y el intervalo de activación del temporizador es de 2 segundos.

Finalmente, use un bucle infinito while(1)y pauseuna función para esperar a que expire el temporizador. Cuando el temporizador expira, el controlador del temporizador timer_handlerse activa e imprime un mensaje.

Vale la pena señalar que
en Linux, la función de procesamiento del temporizador timer_handlerno se procesa en la interrupción, sino que se ejecuta en el contexto del hilo principal. Cuando expira el temporizador, el kernel enviará SIGALRMuna señal al proceso para activar la ejecución de la función de procesamiento de señales (es decir, la función de procesamiento del temporizador).

En el programa de muestra, sigactionun controlador de temporizador está SIGALRMasociado con una señal mediante una función. Luego, use un bucle infinito y una función en el hilo principal pausepara esperar a que expire el temporizador. Cuando el temporizador expira, el kernel envía SIGALRMuna señal para activar la ejecución de la función de procesamiento del temporizador.

hay que tener en cuenta es:

La ejecución de la función de procesamiento del temporizador aquí se realiza en el hilo principal, no en el contexto de interrupción. Por lo tanto, si se realizan operaciones que consumen mucho tiempo en la función de procesamiento del temporizador, la ejecución y el rendimiento de respuesta del hilo principal se verán afectados. Si necesita manejar requisitos de tiempo estrictos en un sistema en tiempo real, puede considerar usar un temporizador en tiempo real o realizar operaciones simples en la función de procesamiento del temporizador y luego colocar la lógica de procesamiento compleja en otros subprocesos para su ejecución.

En Linux, CLOCK_REALTIMEes una constante que se utiliza para especificar el reloj en tiempo real utilizado por funciones como clock_gettimey timer_create.

Un reloj en tiempo real (RTC) es una fuente de reloj relacionada con la hora del sistema que se utiliza para medir el tiempo real del reloj de pared. Proporciona un reloj relativamente estable y continuo que se puede utilizar para obtener la hora real actual.

Úselo CLOCK_REALTIMEcomo parámetro, puede obtener el tiempo real actual o configurar el tiempo real del temporizador. Por ejemplo, clock_gettime(CLOCK_REALTIME, &ts)puede obtener el tiempo real actual y almacenar el resultado en timespecuna variable de estructura ts.

En funciones relacionadas con el temporizador, por ejemplo timer_create, el uso CLOCK_REALTIMEpuede crear un temporizador basado en el reloj de tiempo real. Esto significa que la sincronización del temporizador se basa en la hora real del reloj de pared, que se puede utilizar para implementar diversas operaciones relacionadas con el tiempo, como programación de tareas, tareas de sincronización, etc.

Cabe señalar que CLOCK_REALTIMEel reloj puede verse afectado por los ajustes de hora del sistema (como el ajuste manual de la hora del sistema o la sincronización NTP). Si se requiere un temporizador más preciso y estable, se pueden considerar otras fuentes de reloj como CLOCK_MONOTONIC(reloj monótono) o CLOCK_MONOTONIC_RAW(reloj monotónico imparcial) , que no se verán afectadas por los ajustes de hora del sistema.

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_33471732/article/details/132440188
Recomendado
Clasificación