Linux定时函数介绍:

在程序开发过程中,我们时不时要用到一些定时器,通常如果时间精度要求不高,可以使用sleep,uslepp函数让进程睡眠一段时间来实现定时,前者单位为秒(s),后者为微妙(us);但有时候我们又不想让进程睡眠阻塞在哪儿,我们需要进程正常执行,当到达规定的时间时再去执行相应的操作,

在linux下面我们一般使用alarm函数跟setitimer函数来实现定时功能;

下面对这两个函数进行详细分析:

(1)alarm函数

alarm也称为闹钟函数,它可以在进程中设置一个定时器,当定时器指定的时间到时,它向进程发送SIGALRM信号;

alarm函数原型如下:

 unsigned int alarm(unsigned int seconds);//seconds 为指定的秒数

返回值:
成功:如果调用此alarm()前,进程已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0。
出错:-1
下面是alarm()函数的简单例子:

 #include <stdio.h>#include <string.h>#include <unistd.h>#include <signal.h>void func(){printf("this is func\n");}int main(){signal(SIGALRM, func); //2s后要执行的函数alarm(2);//设置定时2swhile (1);return 0;}

(2)setitimer()函数

在linux下如果对定时要求不太精确的话,使用alarm()和signal()就行了,但是如果想要实现精度较高的定时功能的话,就要使用setitimer函数。

setitimer()为Linux的API,并非C语言的Standard Library,setitimer()有两个功能,一是指定一段时间后,才执行某个function,二是每间格一段时间就执行某个function;

Linux为每个任务安排了3个内部定时器:

ITIMER_REAL:实时定时器,不管进程在何种模式下运行(甚至在进程被挂起时),它总在计数。定时到达,向进程发送SIGALRM信号。

ITIMER_VIRTUAL:这个不是实时定时器,当进程在用户模式(即程序执行时)计算进程执行的时间。定时到达后向该进程发送SIGVTALRM信号。

ITIMER_PROF:进程在用户模式(即程序执行时)和核心模式(即进程调度用时)均计数。定时到达产生SIGPROF信号。ITIMER_PROF记录的时间比ITIMER_VIRTUAL多了进程调度所花的时间。

定时器在初始化是,被赋予一个初始值,随时间递减,递减至0后发出信号,同时恢复初始值。在任务中,我们可以一种或者全部三种定时器,但同一时刻同一类型的定时器只能使用一个。

setitimer函数原型如下:

 #include <sys/time.h>int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value);Timer values are defined by the following structures:struct itimerval {struct timeval it_interval; /* next value */struct timeval it_value;    /* current value */};struct timeval {time_t      tv_sec;         /* seconds */suseconds_t tv_usec;        /* microseconds */};

it_interval用来指定每隔多长时间执行任务, it_value用来保存当前时间离执行任务还有多长时间。比如说, 你指定it_interval为2秒(微秒为0),开始的时候我们把it_value的时间也设定为2秒(微秒为0),当过了一秒, it_value就减少一个为1, 再过1秒,则it_value又减少1,变为0,这个时候发出信号(告诉用户时间到了,可以执行任务了),并且系统自动把it_value的时间重置为 it_interval的值,即2秒,再重新计数

 #include <stdio.h>#include <string.h>#include <stdlib.h>#include <signal.h>#include <sys/time.h>void test_func(){static count = 0;printf("count is %d\n", count++);}void init_sigaction(){struct sigaction act;act.sa_handler = test_func; //设置处理信号的函数act.sa_flags  = 0;sigemptyset(&act.sa_mask);sigaction(SIGPROF, &act, NULL);//时间到发送SIGROF信号}void init_time(){struct itimerval val;val.it_value.tv_sec = 1; //1秒后启用定时器val.it_value.tv_usec = 0;val.it_interval = val.it_value; //定时器间隔为1ssetitimer(ITIMER_PROF, &val, NULL);}int main(int argc, char **argv){init_sigaction();init_time();while(1);return 0;}

可以看出每个一秒输出一个count的值:

下面是运行结果:

130|stvs9:/ # ./test
count is 0
count is 1
count is 2
count is 3
count is 4
count is 5
count is 6
count is 7
count is 8
count is 9

Linux定时函数介绍相关推荐

  1. linux ioctl函数介绍

    1. 概念 ioctl 是设备驱动程序中设备控制接口函数,一个字符设备驱动通常会实现设备打开.关闭.读.写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设 ioctl() 命令的方式实 ...

  2. Linux下定时函数timerfd_xxx()的使用

    Linux系统提供了timerfd系列的定时函数,其具体函数名如下, #include <sys/timerfd.h>int timerfd_create(int clockid, int ...

  3. linux中有fd set函数吗,LINUX下FD_SET介绍

    刚刚了解了linux下select系统调用,函数原型是 #include #include int select(int maxfdpl, fd_set *readset, fd_set *write ...

  4. linux 线程_Linux线程编程专题之线程和线程函数介绍

    ---其实经过这一段时间的Linux应用编程学习,自己总结发现到,在Linux应用编程当中有四大模块我们一定要掌握(这些是最基础的东西): 多进程编程 多线程编程(用的比较多) I/O多路复用 soc ...

  5. linux session刷新,linux 定时清理session

    php session 运营想让用户登陆网站就能永久保持登陆会话,感觉这是扯淡,因为视频播放1小时,所以我设置了两小时过期. 但是用户过多,导致session文件大量存储.产生上百万千万.服务器空间很 ...

  6. python3 转码的函数_python基础3之文件操作、字符编码解码、函数介绍

    内容概要: 一.文件操作 二.字符编码解码 三.函数介绍 一.文件操作 文件操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 基本操作: 1 #/usr/bin/e ...

  7. 树莓派wiringPi常用的函数介绍

    树莓派wiringPi常用的函数介绍 硬件初始化函数: int wiringPiSetup (void) 当使用这个函数初始化树莓派引脚时,程序使用的是wiringPi 引脚编号表,引脚的编号为 0~ ...

  8. Linux定时备份数据到百度云盘

    导读:如今的百度云盘免费容量都是2T了,即使把电脑上所有的东东都放上去,也还有大把的剩余空间.对于站长来说,是完全可以充分利用这些硬盘空间的,现在我们就用百度云盘来备份Linux服务器上的数据.一直在 ...

  9. listen函数介绍

    文章目录 1 listen函数介绍 1 listen函数介绍 #include <sys/types.h> /* See NOTES */ #include <sys/socket. ...

  10. socket函数介绍

    文章目录 1 socket函数介绍 1 socket函数介绍 #include <sys/types.h> /* See NOTES */ #include <sys/socket. ...

最新文章

  1. LeetCode-笔记-523. 连续的子数组和
  2. 静态库和共享库之间的区别?
  3. python可以实现哪些功能_Python学习究竟有多强大,Python代码能实现哪些功能
  4. 【数学】Why Study Math 为什么学习数学
  5. 聚类(序)——监督学习与无监督学习
  6. 解密迈向量产的百度Apollo自动驾驶技术与产品
  7. arp的***和防御
  8. python列表 行列选择_Python第七课——如何选取excel表格的行数据和列数据
  9. 从0开始做Windows Phone 7开发
  10. oracle12c如何存档图片,Oracle Database 12c实用教程
  11. hive 外部表不支持添加列
  12. Scrapy 爬虫框架入门案例详解
  13. WIN10作为服务器操作系统可以吗,服务器可以装win10吗
  14. 图神经网络模型—PATCHY-SAN的基本思想与流程
  15. VectorMapNet | 端到端的矢量化高精地图学习
  16. 巧用seo技术将网站做到第一页
  17. 为什么很多大学生甚至研究生抛弃专业去做码农呢?
  18. 办公知识:有关如何PDF转Word文档的方法分享
  19. 王梦君 matlab,那是每个matlab程序都要有function么 “#”这个符号是什么意...
  20. 【华为OD机试真题 python】机房布局【2023 Q1 | 200分】

热门文章

  1. MyBatis框架的使用及源码分析(三) 配置篇 Configuration
  2. camelCase骆驼拼写法
  3. JQuery 表格拖动调整列宽效果
  4. Enterprise Library - Security Application Block 学习手册(最新版) Part 1
  5. 将数据库表中的数据读出以xml的形式下载到手机端
  6. 新举措!ACL系列会议引入滚动审稿机制
  7. 实战必备!文本分类中的一些经验和 tricks
  8. 据说,很多搞科研的硕博生,都容易产生以下20个错觉,看看你中了几枪?
  9. 【python】读取json文件
  10. 遗传优化算法优化LSTM结构-准确率