LInux下几种定时器的比较和使用

2023-11-15

在数据通信过程中,会遇到对数据发送时间的格式要求。所以要在应用中根据实际要求选择不同的定时器,就要考虑到几种应用定时器的特点。

定时器文章参考 

一般而言有,

1、sleep,usleep和nanosleep

sleep()和nanosleep()都是使进程睡眠一段时间后被唤醒,但是二者的实现完全不同。
Linux中并没有提供系统调用sleep(),sleep()是在库函数中实现的,它是通过调用alarm()来设定报警时间,调用sigsuspend()将进程挂起在信号SIGALARM上,sleep()只能精确到秒级上。

    nanosleep()则是Linux中的系统调用,它是使用定时器来实现的,该调用使调用进程睡眠,并往定时器队列上加入一个timer_list型定时器,time_list结构里包括唤醒时间以及唤醒后执行的函数,通过nanosleep()加入的定时器的执行函数仅仅完成唤醒当前进程的功能。系统通过一定的机制定时检查这些队列(比如通过系统调用陷入核心后,从核心返回用户态前,要检查当前进程的时间片是否已经耗尽,如果是则调用schedule()函数重新调度,该函数中就会检查定时器队列,另外慢中断返回前也会做此检查),如果定时时间已超过,则执行定时器指定的函数唤醒调用进程。当然,由于系统时间片可能丢失,所以nanosleep()精度也不是很高。

alarm()也是通过定时器实现的,但是其精度只精确到秒级,另外,它设置的定时器执行函数是在指定时间向当前进程发送SIGALRM信号。

2、使用信号量SIGALRM + alarm()

alarm方式虽然很好,但这种方式的精度能达到1秒,是无法低于1秒的精度。其中利用了*nix系统的信号量机制,首先注册信号量SIGALRM处理函数,调用alarm(),设置定时长度,代码如下:

//设置一个1s延时信号,再注册一个
#include <stdio.h> #include <signal.h> void timer(int sig) { if(SIGALRM == sig) { printf("timer\n"); alarm(1); //重新继续定时1s } return ; } int main() { signal(SIGALRM, timer); //注册安装信号 alarm(1); //触发定时器 getchar(); return 0; }

 

3、使用RTC机制

RTC机制利用系统硬件提供的Real Time Clock机制,通过读取RTC硬件/dev/rtc,通过ioctl()设置RTC频率,这种方式比较方便,利用了系统硬件提供的RTC,精度可调,而且非常高代码如下:

 

#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设备,我们的1860有两个RTC,用的是电源管理模块的LC1160中的RTC,但是驱动中没有关于RTC_IRQP_SET控制字的支持,需要后期添加驱动实现。

4、使用select()

能精确到1us,目前精确定时的最流行方案。通过使用select(),来设置定时器;原理利用select()方法的第5个参数,第一个参数设置为0,三个文件描述符集都设置为NULL,第5个参数为时间结构体,代码如下:

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

 结果是,每隔1s打印一次,打印100次。

select定时器是阻塞的,在等待时间到来之前什么都不做。要定时可以考虑再开一个线程来做。

 

 

 

 

转载于:https://www.cnblogs.com/feixiao5566/p/6720573.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LInux下几种定时器的比较和使用 的相关文章

  • python代码:基于DDPG(深度确定性梯度策略)算法的售电公司竞价策略研究

    python代码 基于DDPG 深度确定性梯度策略 算法的售电公司竞价策略研究 关键词 DDPG 算法 深度强化学习 电力市场 发电商 竞价 说明文档 完美复现英文文档 可找我看文档 主要内容 代码主要研究的是多个售电公司的竞标以及报价策略
  • 大数据平台测试-git常用操作(白盒测试基础)

    一 前言 学习Git是非常有价值和重要的 无论是一个个人开发者还是在团队中进行协作开发 以下是一些学习Git的原因 版本控制 Git是目前最流行的分布式版本控制系统 可以帮助你跟踪 管理和控制代码的版本 你可以轻松地回退到先前的版本 比较不
  • Python数据处理之导入导出excel数据

    Python的一大应用就是数据分析了 而数据分析中 经常碰到需要处理Excel数据的情况 这里做一个Python处理Excel数据的总结 基本受用大部分情况 相信以后用Python处理Excel数据不再是难事儿 xlwt库将数据导入Exce
  • React实现页面之间的跳转

    目录 1 需求说明 2 技术实现 3 代码展示 4 效果展示 5 参考文献 1 需求说明 目前在学习过程中需要结合自己之前复现的论文算法弄一个人工智能安全平台系统 其中需要做一个前端展示我们的模块 我们点击模块就可以跳转到相应的界面 因为之
  • CGAL 安装配置(Windows+VS2017 64位)

    参照官网安装步骤 1 使用vcpkg安装 会自动安装cgal所需的包 假设已安装cmake 用来编译 和 qt cgal的界面包 具体步骤如下 下载安装vcpkg C dev gt git clone https github com mi
  • 大模型靠“深呼吸”数学再涨8分!谷歌DeepMind发现AI自己设计提示词效果胜人类...

    梦晨 发自 凹非寺量子位 公众号 QbitAI 提示词中加上 深呼吸 AI大模型数学成绩就能再涨8 4分 谷歌DeepMind团队最新发现 用这个新 咒语 Take a deep breath 结合大家已经熟悉的 一步一步地想 Let s
  • spark报错:CREATE TEMPORARY TABLE

    异常信息 2022 02 09 03 14 01 INFO Error in query 2022 02 09 03 14 01 INFO CREATE TEMPORARY TABLE is not supported yet Please
  • 联想拯救者R7000p 2021风扇异响解决办法

    联想拯救者R7000p 2021风扇异响解决办法 23年了 电脑用了2年 F1键下面的风扇跟拖拉机一样 在没有开任何软件下 都一直再高速转 在网上搜了下 看到19款 21款的拯救者都有这个问题 解决办法呢 网上看到的有 更新BIOS 去官网
  • 设计模式(Design Patterns)

    原文地址 http blog csdn net zhangerqing article details 8194653 设计模式 Design Patterns 可复用面向对象软件的基础 设计模式 Design pattern 是一套被反复
  • 机器学习算法+代码

    机器学习 一 概述 1 机器学习研究方向 传统预测 图像识别 自然语言处理 2 数据集构成 数据集 特征值 目标值 监督学习 目标值为类别 属于分类问题 目标值为连续数据 属于回归问题 无监督学习 无目标值 3 机器学习流程 获取数据 数据
  • Python,OpenCV骨架化图像并显示(skeletonize)

    Python OpenCV骨架化图像并显示 skeletonize 1 效果图 2 源码 参考 1 效果图 自己画一张图 原图 VS 骨架效果图如下 opencv logo原图 VS 骨架化效果图如下 2 源码 图像骨架化
  • 统一登录门户系统

    随着等保2 0和密评工作的深入推进 各政企单位的应用系统建设会向着更安全 更标准方向发展 为了推进整合信息共享 破除各系统之间的壁垒 首先要建设的就是统一登录门户系统 常见的统一登录要求 还是基于一个统一的入口 由统一登录入口完成登录后 可
  • kafka java 性能测试_针对kafka_2.13版本测试过程中的一些坑

    声明 这是在windows10上进行kafka 2 13demo搭建时的过程记录 提供给同学们参考 1 jdk先要装一下 自己安装的kafka最好检查一下配置文件中的参数 server properties 1 zookeeper conn
  • Java Pattern.matcher()方法具有什么功能呢?

    转自 Java Pattern matcher 方法具有什么功能呢 下文笔者讲述Pattern matcher 方法的功能简介说明 如下所示 Pattern matcher 方法的功能 用于匹配字符串或返回Matcher实例 Pattern
  • VM安装mac问题

    安装VM以及mac虚拟机 http tieba baidu com p 2847457021 遇见问题 您的 mac os 客户机正在使用cd dvd 此操作无法继续 请忽略此消息 并从客户机内弹 首先 需要下载安装darwin6 iso才
  • 自动化测试岗位建议熟读!!!Python+Selenium代码编写方法大全

    整理过的自动化测试selenium工具代码常用方法大全 对于常使用selenium工具的朋友一定经常会使用 建议熟读熟练 当然收藏之后复制粘贴也可以 这些整理过的web自动化测试进阶资料 有需要的可以进入群聊免费领取点击并输入暗号 CSDN
  • ganymed-ssh2实现java ssh协议采集

    我的博客第一篇讲的就是用Maverick组件实现java ssh协议采集 可惜Maverick是个商业软件 不开放源码且只有45天的试用期 实际上在网上也能搜到不少实现java ssh的开源组件 例如orion ssh2 trilead s
  • Vue路由组件独有的两个生命周期钩子

    1 作用 用于捕获路由组件的激活状态 2 具体名字 2 1 activated路由组件被激活是触发 activated this timer setInterval gt console log this opacity 0 01 if t
  • Elastic Search:(一)快速入门

    目录 1 快速入门 1 1 核心概念介绍 1 2 RESTful风格介绍 1 2 1 概念 1 2 2 方法 1 3 索引 1 3 1 新增索引 PUT 1 3 2 获取索引 GET 1 3 3 删除索引 DELETE 1 3 4 判断索引
  • 以AI对抗AI,大模型安全的“进化论”

    点击关注 文丨刘雨琦 编 王一粟 互联网时代 我们是更危险 还是更安全 2016年 互联网正值高速发展之际 电梯广告经常出现这几个大字 两行标语 从病毒木马到网络诈骗 对于安全的思考 安全防范技术的建立一直在与科技发展赛跑 同样 大模型时代

随机推荐

  • paypal中授权返回_2020最新教程:如何在Unity Ads中填写W-8BEN(W8税表)

    税收资料作为payout profile的一部分 是必须要填写的 即使你不是美国居民 也需要填写个人资料的 纳税 部分 否则将无法获得来自于Unity的付款 由于我们不是美国居民 因此只需要填写W 8BEN即可 其实 它的填写方法与我之前写
  • 计算机中1kb等于多少字节,在计算机中1kb等于多少字节

    在计算机中1kb等于1024个字节 字节是计算机信息技术用于计量存储容量的一种计量单位 也表示一些计算机编程语言中的数据类型和语言字符 一个字节存储8位无符号数 本文操作环境 windows10系统 thinkpad t480电脑 学习视频
  • QEMU-在内核中增加驱动(6)

    上面是我的微信和QQ群 欢迎新朋友的加入 进入linux源码目录 增加驱动 hello c include
  • Java面试----2018最全Redis面试题整理

    1 什么是Redis 答 Redis全称为 Remote Dictionary Server 远程数据服务 是一个基于内存的高性能key value数据库 2 Redis的数据类型 答 Redis支持五种数据类型 string 字符串 ha
  • python 访问网络失败 huggingface ConnectionError

    使用Hugginface下载数据集 dataset load dataset path seamew ChnSentiCorp 结果遇到网络问题 huggingface ConnectionError Couldn t reach 原因是无
  • element中同一个一面使用两个table,使用v-if判断显示,数据混乱

    错误 在一个页面中使用两个table 绑定不同的数据 并且在table中row中使用
  • 梯度下降法求解线性回归--Numpy实现

    梯度下降法求解一元线性回归 依然是这个房价预测的任务 这是一个一元线性回归问题 这次我们采用梯度下降法来求解它可以分为5步 第1步加载样本数据x y 第2步设置超参数 在这个例子中 超参数包括学习率和迭代次数 第3步设置模型参数的初值 w
  • 巧用搜索摆脱新手程序员标签

    文章目录 巧用搜索摆脱新手程序员标签 在哪里搜 搜索什么 搜教程 搜IDE 搜特性 搜集成 搜比较 搜定义 搜原因 搜架构 搜错误 扩展阅读 巧用搜索摆脱新手程序员标签 在哪里搜 国外网站 Google 搜索引擎 Bing 搜索引擎 Git
  • Golang初入编程-踩坑笔记(1)

    一定要自己动手写 不然使用的时候可能连等号的位置都搞不清楚 该语言没有面向对象的概念 什么函数传什么参数返回什么值自己要多练习 i 属于独立语句 不能和其他语句写到一起 自己占一行 以下东东需要初始化 开辟空间 包括切片 指针 map 数组
  • java写一个android程序_【Android开发笔记】3.编写第一个Android程序

    前言 上一节我们通过一个Demo熟悉了Eclipse的基本使用 如何在模拟器和手机中运行以及如何打包成APK 但没具体编写代码 相信很多同学已经按耐不住了吧 这一节我们会动手编写代码来熟悉Android SDK的情况和JAVA的一些特性 声
  • OpenAPI 3.0 规范-食用指南

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • 在Kong网关中使用OAuth2认证

    文章目录 在Kong网关中使用OAuth2认证 前言 在Kong上开启HTTPS OAuth2认证 添加OAuth2插件 创建Consumer的OAuth2 credential 测试OAuth2 Authorization Flow 获取
  • 【无功优化】基于教与学算法实现IEEE_33节点无功优化附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 电力系统 信号
  • Linux一行命令筛选并停止某个服务的进程

    Linux下 筛选某个服务 如nginx 的进程命令 ps ef grep nginx 如果想停掉相应的进程则可以使用kill命令 如果想一行命令筛选出进程号 并kill掉 则 ps ef grep nginx grep v grep aw
  • 解决VC6在Win7或Win10下调试无法结束进程的Bug

    自己的系统是Win7 装上了VC6 调试一段小代码之后再次编译的时候就提示如下的错误 LINK fatal error LNK1168 cannot open Debug 1 exe for writing 意思就是编译要生成同名的 1 e
  • vue中使用Swiper

    一 安装依赖 npm i swiper 二 项目中使用 import swiper swiperSlide from vue awesome swiper import swiper css swiper css div class lb
  • JavaScript基础Day03:数组和函数

    JavaScript基础Day03 文章目录 JavaScript基础Day03 一 关键字break和continue 二 数组 1 数组的定义 2 数组的概念 3 创建数组 4 遍历数组 5 重点 冒泡排序 三 函数 1 参数 2 返回
  • C++与 python 变量生存周期比较

    1 C 中变量生存周期 参考 https blog csdn net darkxiaoming article details 70232620 在C 中变量有以下两种生存周期 变量由编译程序在编译时给其分配存储空间 称为静态存储分配 并在
  • 错误 D8016 “/O2”和“/RTC1”命令行选项不兼容

    错误方式 Debug模式下 优化 最大优化 基本运行时检查 两者RTC1 正确 最大优化 默认值 优化 最大优化 O2 基本运行时检查 设置 默认值
  • LInux下几种定时器的比较和使用

    在数据通信过程中 会遇到对数据发送时间的格式要求 所以要在应用中根据实际要求选择不同的定时器 就要考虑到几种应用定时器的特点 定时器文章参考 一般而言有 1 sleep usleep和nanosleep sleep 和nanosleep 都