首页

文章

如何在Linux下实现定时器

发布网友 发布时间:2022-02-26 11:14

我来回答

2个回答

热心网友 时间:2022-02-26 12:43

可以使用 crontab 命令

热心网友 时间:2022-02-26 14:01

定时器Timer应用场景非常广泛,在Linux下,有以下几种方法:
1,使用sleep()和usleep()
其中sleep精度是1秒,usleep精度是1微妙,具体代码就不写了。使用这种方法缺点比较明显,在Linux系统中,sleep类函数不能保证精度,尤其在系统负载比较大时,sleep一般都会有超时现象。
2,使用信号量SIGALRM + alarm()
这种方式的精度能达到1秒,其中利用了*nix系统的信号量机制,首先注册信号量SIGALRM处理函数,调用alarm(),设置定时长度,代码如下:

[cpp] view plain copy
#include <stdio.h>
#include <signal.h>

void timer(int sig)
{
if(SIGALRM == sig)
{
printf("timer\n");
alarm(1); //we contimue set the timer
}

return ;
}

int main()
{
signal(SIGALRM, timer); //relate the signal and function

alarm(1); //trigger the timer

getchar();

return 0;
}
alarm方式虽然很好,但是无法首先低于1秒的精度。

3,使用RTC机制
RTC机制利用系统硬件提供的Real Time Clock机制,通过读取RTC硬件/dev/rtc,通过ioctl()设置RTC频率,代码如下:

[cpp] view plain copy
#include <stdio.h>
#include <linux/rtc.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
unsigned long i = 0;
unsigned long data = 0;
int retval = 0;
int fd = open ("/dev/rtc", O_RDONLY);

if(fd < 0)
{
perror("open");
exit(errno);
}

/*Set the freq as 4Hz*/
if(ioctl(fd, RTC_IRQP_SET, 1) < 0)
{
perror("ioctl(RTC_IRQP_SET)");
close(fd);
exit(errno);
}
/* Enable periodic interrupts */
if(ioctl(fd, RTC_PIE_ON, 0) < 0)
{
perror("ioctl(RTC_PIE_ON)");
close(fd);
exit(errno);
}

for(i = 0; i < 100; i++)
{
if(read(fd, &data, sizeof(unsigned long)) < 0)
{
perror("read");
close(fd);
exit(errno);

}
printf("timer\n");
}
/* Disable periodic interrupts */
ioctl(fd, RTC_PIE_OFF, 0);
close(fd);

return 0;
}
这种方式比较方便,利用了系统硬件提供的RTC,精度可调,而且非常高。
4,使用select()

这种方法在看APUE神书时候看到的,方法比较冷门,通过使用select(),来设置定时器;原理利用select()方法的第5个参数,第一个参数设置为0,三个文件描述符集都设置为NULL,第5个参数为时间结构体,代码如下:

[cpp] view plain copy
#include <sys/time.h>
#include <sys/select.h>
#include <time.h>
#include <stdio.h>

/*seconds: the seconds; mseconds: the micro seconds*/
void setTimer(int seconds, int mseconds)
{
struct timeval temp;

temp.tv_sec = seconds;
temp.tv_usec = mseconds;

select(0, NULL, NULL, NULL, &temp);
printf("timer\n");

return ;
}

int main()
{
int i;

for(i = 0 ; i < 100; i++)
setTimer(1, 0);

return 0;
}
这种方法精度能够达到微妙级别,网上有很多基于select()的多线程定时器,说明select()稳定性还是非常好。

总结:如果对系统要求比较低,可以考虑使用简单的sleep(),毕竟一行代码就能解决;如果系统对精度要求比较高,则可以考虑RTC机制和select()机制。
CF手游体验服怎样获取资格 穿越火线体验服在哪申请资格_cf手游体验服资格申请入口链接 穿越火线体验服资格申请链接在哪-穿越火线体验服资格申请链接介绍 快手浏览量多少才能赚钱?快手靠浏览量能挣多少钱? 小麦胚芽如何吃最好 个头怎么造句 高跟鞋走路磨脚该如何处理? 除螨虫的特效药 螨虫什么药物可以除掉 网上在哪买奢侈品 二手包包闲置了怎么办 夫妻想要怀孕要提前做哪些准备 手机图片如何投屏到电视上去 手机图片投屏到电视上去的方法 分区助手无法压缩卷怎么处理? 广州北斗公司有哪些 在文件夹里.把cfg文件删掉.电影还可以看么? 办理骑士卡要钱吗? 一千个伤心的理由吉他谱前奏怎么弹出 一千个伤心的理由吉他谱 去中国逛夜市,必买的小吃有哪些? 上海香肠的配料秘方有哪些? 万象嘉禾影城在早上可以折上折吗 单用户重置超级用户密码CentOS7 [转]centos7进入单用户模式修改root密码 教育学专业硕士学位可以读博吗? 关于招商银行外汇期权 外汇USO是什么 ...2输入年份月份日期,计算得到这一天据今天有多少天,星期几... 常用的日期函数的用法和返回的结果 抖音弹幕怎么关掉?怎么关闭抖音弹幕? 惠普LaserJet P3005D是否支持B5纸的双面打印? word打印出图片总是缺一部分怎么办-word打印图片不完整怎么解决_百度... 理想one哪里产的车辆? 抚州抚州ONE在哪里? one地址在哪里? 如何在图片上写字(如何在图片上添加文字) 网商贷为什么钱没到账 高级经济师职称怎么评 高级经济师需要评审吗 赋权增能理论? 想要进移动公司上班,需要什么的基本条件啊 如何取消淘宝红包 网联客app最新版怎么注册 DN65室内消防栓有什么特点 泌尿道感染影像学检查 尿常规可以检查泌尿系感染吗 12306铁路儿童票怎么购买 儿童票购买方法介绍 12306如何申报免费乘车儿童车票 申报免费乘车儿童车票方法介绍_百度... 手机删除了微信好友还能在电脑上看到吗 打印机显示准备就绪就是不能打印问题 打印机显示就绪但无法打印如何解决_打印机显示就绪但无法打印怎么办 在手机上使用录屏大师微课录完以后怎么样保存然后怎么样发送给发送到电脑上? linux 定时任务的方法有哪些 录屏大师本地视频如何移到录屏大师内的云端视频 在手机上用录屏大师怎么把视频导入优酷 linux定时任务怎么写 怎样在linux中使用crontab编写一个定时任务,可以实现以下功能: 在linux 系统上怎样手动跑定时任务 怎么把在录屏大师里录好的视频,传送到手机文件里(我是oppo) linux如何设置定时任务 excel打印的时候字太多显示不完整 excel打印字显示不全 linux里面制定计划任务语句crontab 为什么在excel中加入的文字显示不全? 在EXcel的一个单元格中输入了很多文字,但是显示不全 EXCEL内容显示不全 linux下如何设置,才能定时开机 excel里面文字显示不全 在excel表格里写的字显示不全 为什么excel里面的内容显示不全 excel文字显示不全 在Linux操作系统中怎样配置每天定时关机 linux上如何运行java程序及如何在linux定时调用java程序 在电脑桌面上怎么建一个文件夹 linux 定时任务 ping linux 定时任务怎么看执行 淘宝购物怎么分期付款 linux 定时任务 我写的每小时执行 怎么实现的是每分钟执行 linux 建立一个一次性计划任务:3小时以后关闭系统; linux操作题:创建一个计划任务crontab 电脑符号怎么打_ linux下怎么查看已经执行的计划任务?如果想建一个计划任务又怎么建?建好后,想修改又该在哪里修改?求详解! 电脑怎么才能打出@这个符号 linux 写一个计划任务的脚本,在每个月1号的凌晨3点定时备份/boot、/etc、 /home、/root linux操作系统想执行一个计划任务脚本是自己写的,主要用于备份数据库 。问计划任务的语句怎么写 在电脑怎么打符号 电脑怎样打符号? linux 写一个计划任务的脚本,在每个月1号的凌晨3点定时备份/boot、/etc、 /home、/root、 为什么用qq登录快手极速版不能使用小屏模式? 快手极速版不能签到了怎么办 每个月的最后一个周五执行一个计划任务,怎么做,linux里
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com