linux下实现定时器的三种简单方式

这篇具有很好参考价值的文章主要介绍了linux下实现定时器的三种简单方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一. sleep()和usleep()

1.sleep()

2.usleep()

3.毫秒级延时

二. signal与alarm()

三. select

四. 一些总结


一. sleep()和usleep()

        优点是简单便捷,直接调用即可,但是缺点也很明显,精度不够,特别是在系统负载比较大时,会发生超时现象。

1.sleep()

#include <unistd.h>

unsigned int sleep(unsigned int   seconds);

功能:执行挂起指定的秒数

        sleep()只能精确到秒级上。sleep()非系统调用,sleep()是在库函数中实现的,它是通过alarm()来设定报警时间,使用sigsuspend()将进程挂起在信号SIGALARM上。sleep()会令目前的进程暂停,直到达到参数seconds 所指定的时间,或是被信号所中断。

2.usleep()

#include <unistd.h>

void usleep(int     micro_seconds);

功能:把进程挂起一段时间,单位是微秒(百万分之一)

        除了时间单位为微秒以外,在使用上与sleep()差不多。但实现是不同的,sleep是用alarm实现的,所以时间单位为s ,而usleep的时间单位为us,肯定不是由alarm实现的,所以说它们的实现不同,但都是linux用的,而window下不能用,因为都是sleep和usleep都是在unistd.h下定义的。

        一般情况下,延迟时间数量级是秒的时候,尽可能使用sleep()函数。如果延迟时间为几十毫秒(1ms = 1000us),或者更小,尽可能使用usleep()函数。这样才能最佳的利用CPU时间。

3.毫秒级延时

        因为linux下没有现成的毫秒级延时,这里我们可以自己简单写一个:

#include <unistd.h>

void msleep(unsigned long     ms)
{
    struct timeval        tv;
    tv.tv_sec = ms/1000;
    tv.tv_usec = (ms%1000)*1000;

    select(0, NULL, NULL, NULL, &tv);
}

二. signal与alarm()

        使用signal函数设定SIGALRM的处理函数,然后使用alarm()定时发送SIGALRM来实现。  

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

int alarm_flag=1;

void timer(int sig)
{
    if(SIGALRM == sig)
    {
        alarm_flag = 1;
    }
    return;
}

int main()
{
    signal(SIGALRM, timer);
    
    while( alrm_flag )
    {
        alarm_flag = 0;

        printf("hello\n");
        alarm(5);
     }

    return 0;
}

#include <unistd.h>

unsigned int alarm(unsigned int         seconds);        

功能:设置信号传送闹钟

        alarm()也称为闹钟函数,alarm()函数的主要功能是设置信号传送闹钟,即⽤来设置信号SIGALRM 在经过参数seconds 秒数后发送给⽬前的进程。如果未设置信号SIGALARM 的处理函数,那么alarm()默认处理终⽌进程。如果参数seconds为0,则之前设置的闹钟会被取消,并将剩下的时间返回。

        PS:一个进程只能有一个闹钟时间,如果在调用alarm之前已设置过闹钟时间,则任何以前的闹钟时间都被新值所代替。

三. select

#include <sys/select.h>

#include <sys/time.h>

#include <sys/types.h>

#include <unistd.h>

int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval * timeout);

功能:用来等待文件描述词状态的改变。参数n代表最大的文件描述词加1,参数readfds、writefds 和exceptfds称为描述词组,是用来回传该描述词的读,写或例外的状况。

         这里就不详细介绍select函数的参数及功能了,大家感兴趣可以自行查阅。这里要实现定时器的话,把第一个参数设置为0,中间三个文件描述符集都设置为NULL,第五个参数为时间结构体,我们主要就是使用参数,把它设置为我们想要定时的频率就好。

        timeout为结构timeval,用来设置select()的等待时间,其结构定义如下:

struct timeval

{

        time_t        tv_sec;

        time_t        tv_usec;
};

#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

void timer_s(unsigned long    s, unsigned long     us)
{
    struct timeval        tv;

    tv.tv_sec = s;
    tv.tv_usec = us;

    select(0, NULL, NULL, NULL, &tv);
}

int main()
{
    while(1)
    {
        printf("hello\n");
        timer_s(3, 0);
    }

    return 0;
}

四. 一些总结

linux 定时器,linux,笔记,linux,学习

        大家根据自己需求选择,这是在网上扒下来的一张图,原文链接如下:

Linux中的sleep、usleep、nanosleep、poll和select不同的sleep方式https://mp.weixin.qq.com/s?src=11×tamp=1680196399&ver=4438&signature=LzDVJT7uLU7DuxA6qxK8Sm4FqjJw8G347mhB56nkDIb5R2XQsifqz-NFi1nmisdVYxrrRNgLVKIJqjN4koJ59oTtTBWunbaWVMV7u6dNydmBRf-DA9aR6yVNKkbJF*oI&new=1文章来源地址https://www.toymoban.com/news/detail-590625.html

到了这里,关于linux下实现定时器的三种简单方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 无缘蜂鸣器——stm32定时器PWM实现控制发出“哆瑞咪发…“七个音及简单音乐

    一、有缘蜂鸣器和无缘蜂鸣器 所谓的 有源蜂鸣器 是指蜂鸣器内部内置振荡电路,一通电就能响。但发生频率固定,音色单一; 无源蜂鸣 器内部不含振荡源,内部结构相当于电磁场扬声器,可以通过给他输出一定频率的信号才能发声。人耳能听到的频率范围在20Hz–20kHz之间

    2024年02月02日
    浏览(54)
  • 基于HAL库的STM32单定时器多路输入捕获测量PWM的频率和占空比实现(状态机方式实现)

    目录  写在前面 先回顾下定时器的单路捕获PWM 多路捕获PWM的频率和占空比(状态机实现) 我的思路: 状态图 配置 给出示例代码 测试效果         先有了这篇文章实现了单定时器的多通道测量频率,以外部时钟的方式可测量任意频率的方波),奈何不能多路测试PWM波的频率,

    2024年02月12日
    浏览(38)
  • 【51单片机】:定时器的详解(包括对单片机定时解释、各类定时方式,以及中断方式)

              51定时/计数器的详解。                   码字不易,如有帮助请收藏,点赞哦。         前提:首先我们知道51单片机内部有21~26个特殊功能寄存器: P.x口寄存器:P0、P1、P2、P3 数据指针寄存器:DP0H、DP0L、DP1H、DP1L 定时器: TH1、TL1、TH0、TL0、TMOD、TCON 串口:

    2024年02月07日
    浏览(74)
  • 通俗理解TIM定时器并简单使用

    前言:本文章部分代码参考自野火的例程 本人使用的是野火家的指南者开发板,芯片型号是STM32f103VET6 有纰漏请指出,转载请说明。 学习交流请发邮件 1280253714@qq.com 源代码在这里 B站这位UP主讲51单片机定时器工作原理 讲得很好 stm32有3种定时器,分别是基本定时器、通用定时

    2024年02月10日
    浏览(30)
  • RabbitMQ 简单实现创建队列的三种方式

    //1. 手动创建,需在RabbitMQ中手动创建myQueue1 队列,否则报错 @RabbitListener(queues = “myQueue1”) public void process1(String message){ log.info(“MqReceiver1: {}”, message); } //2. 自动创建队列 @RabbitListener(queuesToDeclare = @Queue(“myQueue2”)) public void process2(String message){ log.info(“MqReceiver2: {}”, messa

    2024年02月15日
    浏览(30)
  • 【STM32H7 开发笔记】| 02 - 通过定时器级联方式同步启动多个定时器并输出 PWM 波形

    (STM32H723xE/G) 所有定时器包括 两个高级控制定时器、十二个通用定时器、两个基本定时器、五个低功耗定时器、两个看门狗定时器和一个SysTick定时器 。所有计时器计数器都可以在Debug模式下冻结。 本次实验主频配置的是500MHz 高级控制定时器(TIM1,TIM8)可以看作是在6通道

    2024年02月14日
    浏览(26)
  • stm32定时器方式精确输出指定脉冲个数

    本例使用芯片为 STM32f407zg 使用标准库编程 输出指定脉冲个数的PWM方法主要有两种:计数器中断方式和定时器同步方式。 项目输出可控双脉冲pwm波形,可根据需要控制输出脉冲个数,查阅网上资料大部分为HAL库配置,自己实际第一次编程有些一头雾水,后查阅官方帮助手册和

    2024年02月16日
    浏览(40)
  • STM32 定时器时间设定及计算最简单理解

    玩了一段时间STM32,没有经过系统学习,对这个定时器定时时间计算理解很懵懂! 如下面定时器初始化代码 TIM_Period=自动装载值 TIM_Prescaler=预分频值 定时时间计算: 定时时间=(TIM_Period)X(TIM_Prescaler)/Timer clocks(定时器时钟频率) 假如:TIM_Period=5000,TIM_Prescaler=84,Timer clocks=84Mhz

    2024年02月08日
    浏览(36)
  • Linux 内核定时器

    一、相关知识点 (一)知识点 1、内核定时器分类     1)标准定时器或系统定时器     2)高精度定时器(HRT)         头文件:#include linux/hrtimer.h 2、检查系统是否可用HRT     1)查看内核配置文件              2)查看机器         cat proc/timer_list  | grep \\\"resolution\\\" 

    2024年02月11日
    浏览(29)
  • Linux定时器

    Linux定时器是一种 软件机制 ,用于在指定的时间间隔或特定时间点执行特定的任务。它是 基于内核的机制 ,可以用于各种应用场景,如定时任务调度、延时处理、周期性事件触发等。 运作机制(工作原理):Linux定时器的工作原理主要分为两个部分:定时器的创建和定时器

    2024年02月03日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包