Linux 下定时器实现方式介绍
在 Linux 中使用 C 语言实现定时器,可以通过多种方式来实现。以下是几种常用的方法:
使用 alarm()
函数
alarm()
函数用于在指定的秒数后发送一个 SIGALRM
信号给进程。可以通过捕获这个信号来执行定时任务。
#include <stdio.h>
#include <unistd.h>
#include <signal.h>void handle_alarm(int sig) {printf("Timer expired!\n");
}int main() {signal(SIGALRM, handle_alarm); // 设置信号处理函数alarm(5); // 5秒后发送SIGALRM信号pause(); // 等待信号return 0;
}
使用 setitimer()
函数
setitimer()
函数可以设置更精确的定时器,支持微秒级别的定时。
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/time.h>void handle_timer(int sig) {printf("Timer expired!\n");
}int main() {struct itimerval timer;signal(SIGALRM, handle_timer); // 设置信号处理函数// 设置定时器为2秒后触发,然后每隔2秒触发一次timer.it_value.tv_sec = 2;timer.it_value.tv_usec = 0;timer.it_interval.tv_sec = 2;timer.it_interval.tv_usec = 0;setitimer(ITIMER_REAL, &timer, NULL);while (1) {pause(); // 等待信号}return 0;
}
使用 POSIX 定时器 (timer_create()
)
POSIX 定时器提供了更灵活和强大的定时功能,可以与线程结合使用。
#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>void handle_timer(union sigval sv) {printf("Timer expired!\n");
}int main() {timer_t timerid;struct sigevent sev;struct itimerspec its;// 设置定时器事件sev.sigev_notify = SIGEV_THREAD;sev.sigev_value.sival_ptr = &timerid;sev.sigev_notify_function = handle_timer;sev.sigev_notify_attributes = NULL;timer_create(CLOCK_REALTIME, &sev, &timerid);// 设置定时器为3秒后触发,然后每隔3秒触发一次its.it_value.tv_sec = 3;its.it_value.tv_nsec = 0;its.it_interval.tv_sec = 3;its.it_interval.tv_nsec = 0;timer_settime(timerid, 0, &its, NULL);while (1) {pause(); // 等待信号}return 0;
}
定时执行函数实现例子
#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <alloca.h>
#include <syslog.h>
#include <sys/stat.h>
#include <sys/types.h>#define BLACK_MAC_TIME 5*60 //5 min
time_t g_timer_id = 0;void timer_start(int interval, void *function)
{printf("timer_start\n"); timer_t timerid; struct sigevent evp; memset(&evp, 0, sizeof(struct sigevent)); evp.sigev_value.sival_int = 111; evp.sigev_notify = SIGEV_THREAD; evp.sigev_notify_function = function; if (timer_create(CLOCK_REALTIME, &evp, &timerid) == -1) { printf("fail to timer_create\n"); return ; } struct itimerspec it; it.it_interval.tv_sec = interval; it.it_interval.tv_nsec = 0; it.it_value.tv_sec = interval; it.it_value.tv_nsec = 0;if (timer_settime(timerid, 0, &it, NULL) == -1) { printf("fail to timer_settime\n"); return ; }g_timer_id = timerid;printf("timer_start timerid:%ld\n",timerid);
}void my_timer_stop()
{printf("time stop\n");timer_delete(g_timer_id);g_timer_id = 0;
}void stop_timer_function(void)
{printf("I will stop timer \r\n");my_timer_stop();printf("stop timer\r\n");
}int main()
{ printf("main\n");int a=10;timer_start(BLACK_MAC_TIME, remove_mac_from_black_acl);while (1) {pause(); // 等待信号}return 0;
}