En Linux, funciones como timer_create
, timer_settime
y se pueden utilizar timer_delete
para 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 sigaction
la función del controlador del temporizador con la señal.SIGALRM
A continuación, cree una timer_create
función de uso del temporizador, configure el método de notificación del temporizador en SIGEV_SIGNAL
y la señal en SIGALRM
. Cuando el temporizador expira, se envía una señal SIGALRM
.
Luego, utilice timer_settime
las 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 pause
una función para esperar a que expire el temporizador. Cuando el temporizador expira, el controlador del temporizador timer_handler
se activa e imprime un mensaje.
Vale la pena señalar que
en Linux, la función de procesamiento del temporizador timer_handler
no se procesa en la interrupción, sino que se ejecuta en el contexto del hilo principal. Cuando expira el temporizador, el kernel enviará SIGALRM
una 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, sigaction
un controlador de temporizador está SIGALRM
asociado con una señal mediante una función. Luego, use un bucle infinito y una función en el hilo principal pause
para esperar a que expire el temporizador. Cuando el temporizador expira, el kernel envía SIGALRM
una 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_REALTIME
es una constante que se utiliza para especificar el reloj en tiempo real utilizado por funciones como clock_gettime
y 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_REALTIME
como 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 timespec
una variable de estructura ts
.
En funciones relacionadas con el temporizador, por ejemplo timer_create
, el uso CLOCK_REALTIME
puede 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_REALTIME
el 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.