欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > [linux]linux c实现定时器代码例子

[linux]linux c实现定时器代码例子

2025/9/15 14:44:46 来源:https://blog.csdn.net/wgl307293845/article/details/143978661  浏览:    关键词:[linux]linux c实现定时器代码例子

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词