返回顶部
首页 > 资讯 > 操作系统 >linux下如何使用select实现精确定时器
  • 949
分享到

linux下如何使用select实现精确定时器

2023-06-09 19:06:27 949人浏览 泡泡鱼
摘要

这篇文章主要介绍“linux下如何使用select实现精确定时器”,在日常操作中,相信很多人在linux下如何使用select实现精确定时器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux下如何使用s

这篇文章主要介绍“linux下如何使用select实现精确定时器”,在日常操作中,相信很多人在linux下如何使用select实现精确定时器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux下如何使用select实现精确定时器”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

在编写程序时,我们经常会用到定时器。首先看看select函数原型如下:

代码如下:


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


参数说明:
slect的第一个参数nfds为fdset集合中最大描述符值加1,fdset是一个位数组,其大小限制为__FD_SETSIZE(1024),位数组的每一位代表其对应的描述符是否需要被检查。
select的第二三四个参数表示需要关注读、写、错误事件的文件描述符位数组,这些参数既是输入参数也是输出参数,可能会被内核修改用于标示哪些描述符上发生了关注的事件。所以每次调用select前都需重新初始化fdset。
timeout参数为超时时间,该结构会被内核修改,其值为超时剩余的时间。
利用select实现定时器,需要利用其timeout参数,注意到:
 1)select函数使用了一个结构体timeval作为其参数。
 2)select函数会更新timeval的值,timeval保持的值为剩余时间。
如果我们指定了参数timeval的值,而将其他参数都置为0或者NULL,那么在时间耗尽后,select函数便返回,基于这一点,我们可以利用select实现精确定时。
timeval的结构如下:

代码如下:


struct timeval{
long tv_sec;
}


我们可以看出其精确到microseconds也即微妙。
一、秒级定时器

代码如下:


void seconds_sleep(unsigned seconds){
    struct timeval tv;
    tv.tv_sec=seconds;
    tv.tv_usec=0;
    int err;
    do{
       err=select(0,NULL,NULL,NULL,&tv);
    }while(err<0 && errno==EINTR);
}


 二、毫秒级别定时器

代码如下:


void milliseconds_sleep(unsigned long mSec){
    struct timeval tv;
    tv.tv_sec=mSec/1000;
    tv.tv_usec=(mSec%1000)*1000;
    int err;
    do{
       err=select(0,NULL,NULL,NULL,&tv);
    }while(err<0 && errno==EINTR);
}


 三、微妙级别定时器

代码如下:


void microseconds_sleep(unsigned long uSec){
    struct timeval tv;
    tv.tv_sec=uSec/1000000;
    tv.tv_usec=uSec%1000000;
    int err;
    do{
        err=select(0,NULL,NULL,NULL,&tv);
    }while(err<0 && errno==EINTR);
}


现在我们来编写几行代码看看定时效果吧。

代码如下:


#include <stdio.h>
#include <sys/time.h>
#include <errno.h>
int main()
{
    int i;
    for(i=0;i<5;++i){
    printf("%d\n",i);
    //seconds_sleep(1);
    //milliseconds_sleep(1500);
    microseconds_sleep(1900000);
    }
}


 注:timeval结构体中虽然指定了一个微妙级别的分辨率,但内核支持的分别率往往没有这么高,很多unix内核将超时值向上舍入成10ms的倍数。此外,加上内核调度延时现象,即定时器时间到后,内核还需要花一定时间调度相应进程的运行。因此,定时器的精度,最终还是由内核支持的分别率决定。

到此,关于“linux下如何使用select实现精确定时器”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: linux下如何使用select实现精确定时器

本文链接: https://lsjlt.com/news/257630.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • linux下如何使用select实现精确定时器
    这篇文章主要介绍“linux下如何使用select实现精确定时器”,在日常操作中,相信很多人在linux下如何使用select实现精确定时器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux下如何使用s...
    99+
    2023-06-09
  • linux使用select实现精确定时器详解
    在编写程序时,我们经常会用到定时器。首先看看select函数原型如下: int select(int nfds, fd_set *readfds, fd_set *writefds, ...
    99+
    2022-06-04
    定时器 详解 精确
  • linux下如何实现定时关机
    这篇文章主要讲解了“linux下如何实现定时关机”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux下如何实现定时关机”吧!用crontab命令就可以了,下面看一下它的详细用法。名称 :...
    99+
    2023-06-10
  • 如何正确的使用jdk定时器
    本篇文章给大家分享的是有关如何正确的使用jdk定时器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先看一下jdk自带定时器:一种工具,线程用其安排以后在后台线程中执行的任务。...
    99+
    2023-05-31
    jdk
  • 如何正确的使用spring定时器
    如何正确的使用spring定时器?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。第一种,使用XML配置的方法前期工作,配置spring的开发环境(这里用到了spr...
    99+
    2023-05-31
    spring
  • LINUX下如何用CRON实现定时执行脚本
    这篇文章主要为大家展示了“LINUX下如何用CRON实现定时执行脚本”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“LINUX下如何用CRON实现定时执行脚本”这...
    99+
    2024-04-02
  • 使用静态定位技术实现精确定位的方法
    如何使用静态定位实现精准定位 随着科技的不断发展,定位技术也越来越成熟,已经成为我们日常生活不可或缺的一部分。而对于一些需要精确定位的场景,我们需要更加准确和可靠的定位技术来满足需求。静态定位便是一种实现精准定位的方法之一。本文...
    99+
    2024-01-18
    静态定位:静态 精准定位:精准 实现定位:实现
  • 在Linux下如何确定网卡所使用驱动程序
    这篇文章主要介绍在Linux下如何确定网卡所使用驱动程序,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!无论是集成网卡还是独立的网卡,都必须通过某种方式连接到PCI总线上,这样的话,必定有有一个代号,这个代号可以通过下...
    99+
    2023-06-12
  • Linux下如何正确使用sudo命令
    这篇“Linux下如何正确使用sudo命令”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux下如何正确使用sudo命令...
    99+
    2023-06-27
  • Linux下Select多路复用如何实现简易聊天室
    这篇文章主要介绍“Linux下Select多路复用如何实现简易聊天室”,在日常操作中,相信很多人在Linux下Select多路复用如何实现简易聊天室问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux下S...
    99+
    2023-06-21
  • 如何在 Linux 环境下使用 Laravel 实现重定向?
    在 Linux 环境下使用 Laravel 实现重定向是一个非常常见的需求。在本文中,我们将会详细介绍如何使用 Laravel 实现重定向,并且会穿插一些演示代码来帮助你更好地理解。 首先,让我们来了解一下什么是重定向。重定向是指当用户访问...
    99+
    2023-09-16
    linux laravel 重定向
  • vue.js中select下拉框如何实现绑定和取值
    这篇文章将为大家详细讲解有关vue.js中select下拉框如何实现绑定和取值,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、绑定select下拉框的代码很简单send...
    99+
    2024-04-02
  • 如何在linux中使用crontab定时器
    如何在linux中使用crontab定时器?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。编辑:crontab –u root –e列表:crontab –u root –l...
    99+
    2023-06-09
  • linux多线程定时器如何使用
    在Linux上使用多线程定时器,可以使用以下步骤:1. 包含必要的头文件:```c#include #include #includ...
    99+
    2023-10-09
    linux
  • Linux下使用PHP实现HTTP通信,如何保证实时性?
    在现代互联网的环境下,HTTP通信已经成为了不可或缺的一部分。对于基于Linux系统下的PHP开发者而言,实现HTTP通信也是日常开发工作中的一个重要环节。但是如何保证HTTP通信的实时性呢?本文将详细探讨这个问题,并提供一些PHP代码示...
    99+
    2023-10-07
    实时 linux http
  • 在Linux环境下,如何使用PHP实现实时HTTP通信?
    随着互联网技术的发展,实时通信已经成为了互联网应用的重要组成部分。而HTTP协议作为互联网上的一种基本协议,也逐渐被应用到实时通信中。本文将介绍如何使用PHP在Linux环境下实现实时HTTP通信,同时提供代码演示。 一、HTTP协议简介...
    99+
    2023-10-07
    实时 linux http
  • 如何使用Linux中shell脚本实现FTP定时执行批量下载指定文件
    小编给大家分享一下如何使用Linux中shell脚本实现FTP定时执行批量下载指定文件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用FTP定时批量下载指定文件...
    99+
    2023-06-09
  • 如何实现linux下syslog的使用
    这篇文章的内容主要围绕如何实现linux下syslog的使用进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!syslog 系统日志应用 1)...
    99+
    2023-06-28
  • 如何使用Qt实现线程与定时器
    这篇文章主要介绍如何使用Qt实现线程与定时器,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、定时器QTimer类The QTimer class provides repetitive and single-sho...
    99+
    2023-06-26
  • ASP 重定向:如何在 Linux 环境下使用 Laravel 实现?
    ASP重定向是一种在Web开发中经常使用的技术,它可以将用户请求重定向到另一个URL。在Linux环境下,使用Laravel框架可以轻松实现ASP重定向功能。本文将介绍如何使用Laravel实现ASP重定向,并提供一些演示代码供参考。 一、...
    99+
    2023-07-30
    重定向 linux laravel
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作