定时休眠 linux,linux系统编程手册 定时器和休眠
一、间隔定时器
1.setitimer
settitimer创建一个间隔式定时器,这种定时器会在未来某个时间到期,并于此后(可选择地)每隔一段时间到期一次
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
参数 which:
1. ITIMER_REAL 创建真实倒计时定时器。到期产生SIGALARM信号
2.ITIMER_VIRTUAL 创建以进程虚拟时间(用户模式下的cpu时间)倒计时定时器。到期产生SIGVTALRM信号
3.ITIMER_PROF 创建一个profiling定时器,以进程时间(用户态与内核态cpu时间总和)倒计时。到期产生SIGPROF信号。
所有这些信号的默认处理都会终止进程。
参数 new_value和old_value都是指向struct itimerval的指针。
struct itimerval {
struct timeval it_interval;
struct timeval it_value;
}
其中的timeval结构体如下:由秒和微妙组成
struc timeval {
time_t tv_sec;//秒
suseconds tv_usec;//微妙
}
参数new_value的下属结构it_value指定了距离定时器到期的延时时间。it_interval说明该定时器是否为周期性定时器。如果it_interval的两个字段均为0,那么就是一次性定时器。只要任何一个字段非零,那么在每次定时器到期之后,都会将定时器重置为指定间隔后再次到期。
进程只能拥有上述3中定时器的一种。当第2次调用settitimer时时将new_value的两个字段均设置为0,那么会屏蔽任何已有的定时器。
参数old_value是一个输出参数,如果参数不为NULL,返回之前定时器的设置。如果old_value的两个字段都为0说明该定时器处于屏蔽状态。如果old_value.it_interval的两个字段都为0,说明之前定时器设置的是一次性定时器。如果不关心前一次的定时器设置,将old_value设置为NULL就可以了。
定时器会从初始值(it_value)倒计时一直到0为止。递减为0时,会将相应的信号发送给进程,随后,如果it_interval非0,那么会再次将it_value加载至定时器,重新计时。
我们可以在任何时候调用gettitimer函数,了解定时器当前状态、距离下次到期的剩余时间。
int getitimer(int which, struct itimerval *curr_value)
which指定是哪种定时器,curr_value返回就是剩余时间。
2. alarm
系统调用alarm函数创建一次性实时定时器提供了一个简单的接口
unsigned int alarm(unsigned int seconds);
参数seconds表示定时器到期的秒数。到期后发送SIGALRM信号。
调用alarm会覆盖对定时器的前一次设置,调用alarm(0)可屏蔽现有定时器。
3. setitimer alarm联系
alarm和setitimer针对同一进程共享一个实时定时器,这意味着,无论调用两者哪个都覆盖了之前的设置。
二、POSIX间隔式定时器
使用setitimer来设置定时器,有几个制约:
1.针对ITIMER_REAL ITIMER_VIRTUAL ITIMER_PROF这3类定时器,每种只能设置一个
2.只能通过发送信号的方式来通知定时器,另外也不能改变到期的信号
3.如果一个间隔式定时器到期多次,且相应的信号阻塞,那么只会调用一次信号处理函数
4.分别率只能达到微妙级
因此我们可以使用timer_create函数创建定时器
timer_create函数,可以发送信号给进程也可以给线程,可以开启线程调用函数处理定时器到期。
这里具体函数使用就不说了
timer_settime函数设置定时器并且开启
timer_gettime获取定时器当前值
timer_delete删除定时器
三、利用文件描述符进行通知的定时器
linux特有的timerfd API,可以从文件描述符中读取所创建定时器的到期通知。可以使用select poll epoll将这样描述符和其他描述符一同进行监控,非常方便。
这几个API和之前的timer_create timer_setime timer_gettime相类似。
int timerfd_create(int clockid, int flags)
clockid可以设置为CLOCK_REALTIME CLOCK_MONOTONIC
int timerfd_settime(int fd, int flags, const struct itimerspec *new_value,
struct itimerspec *old_value)
new_value设置定时器,old_value获取定时器前一设置。
int timerfd_gettime(int fd, struct itimerspec *curr_value)
timerfd_gettime获取定时器到期的剩余时间
定时器到期后我们可以通过read文件描述符来获取定时器到期信息。
定时休眠 linux,linux系统编程手册 定时器和休眠相关推荐
- linux/unix系统编程手册11-15
title: linux/unix编程手册-11_15 date: 2018-05-27 11:53:07 categories: programming tags: tips linux/unix编 ...
- Linux/Unix系统编程手册 第三章:系统编程概念
本章介绍系统编程的基础概念和一些后续章节用到的函数及头文件,并说明了可移植性问题. 系统调用是受控的内核入口,通过系统调用,进程可以请求内核以自己的名义去执行某些动作,比如创建子进程,执行I/O操作, ...
- Linux/UNIX系统编程手册gg
Linux系统: "所见皆文件" 一个比较好的博客 一.Linux基础操作 Linux系统目录: bin:存放二进制可执行文件 boot:存放开机启动程序 dev:存放设备文件: ...
- Linux系统编程手册-源码的使用
Linux系统编程手册-源码的使用 转自:http://www.cnblogs.com/pluse/p/6296992.html 第三章后续部分重点介绍了后面章节所要使用的头文件及其实现,主要如下: ...
- LINUX C系统编程与PYTHON中的时间模块对比
今天看python时间模块time的时候发现和LINUX系统编程中的时间调用函数基本一样,以前刚好没有好好学习LINUX C编程的时间模块就对比进行了学习. 本文只是给出函数接口和使用方式,详细了解请 ...
- ①Linux简明系统编程(嵌入式公众号的课)---总课时12h
10.09 注意:这个是Linux高级编程的简明教程,是Linux应用程序的开发,而不是底层程序的开发. 内容是关于操作系统和网络编程的吗? Linux简明系统编程 〇.课程思维导图 〇.会用到的头文 ...
- 【Linux】系统编程之文件(标准I/O库)
目录 一.文件I/O与标准I/O的区别(open与fopen) 1.来源 2.移植性 3.适用范围 4.文件IO层次 5.缓冲 二.函数fopen.fwrite.fread.fseek.fclose ...
- LinuxUNIX系统编程手册(英文版)pdf
下载地址:网盘下载 詹森D.巴克斯编著的<ARM嵌入式系统编程与优化(英文版)>结合ARM架构和Linux工具,关注以性能为导向的嵌入式编程,深入讲解如何通过对数据.算法和存储等层面的优化 ...
- linux经典书籍--linux系统编程手册
最新文章
- python安装工具命令pip安装慢切换为国内阿里云镜像方法及前后对比
- 想学python编程-想学Python编程?你真的适合吗?
- 疯狂python讲义视频 百度云-疯狂Python讲义 PDF 含源码工具版
- canvas的特别棒的feature:badge!!!
- 深圳内推 | 粤港澳大湾区数字经济研究院招聘NLP算法研究员(可实习)
- LeetCode 748. 最短完整词
- 学术工业界大佬联合打造:ML产品落地流程指南
- c#使用CefSharp开发winform——环境搭建
- rabbitmq添加user及vhost
- Excel表格如何根据身份证号计算年龄
- ccs加载out文件,TI CCS3.3 out文件转bin文件说明
- HTML5 Audio时代的MIDI音乐文件播放 .
- Photoshop 安装 Topaz 滤镜
- 你真正了解图像金字塔吗?详细介绍拉普拉斯金字塔和高斯金字塔(pyrDown() and pyrUp()),参考《OpenCV轻松入门:面向Python》
- html展示微信昵称特殊字符,微信昵称特殊符号(独一无二的特殊符号)
- opencv-python cv2.VideoWriter() 导出视频无法播放的四个原因
- php数据结构 链表,php数据结构-单链表
- 关于vue的组件重新加载
- lumen报错Class redis does not exist
- Mysql索引介绍及使用注意事项,limit分页查询,慢查询分析
热门文章
- .Net IOC框架入门之一 Unity
- 常用excel函数 vlookup,concatenate, 的使用
- clickjacking:X-frame-options header missing 漏洞解决办法
- MongoDB(两)mongoDB基本介绍
- Lesson 6 Smash-and-grab 砸橱窗抢劫
- 黑马程序员——关于static关键字
- 汇编语言-王爽 随书源码、检测点、实验答案
- java csv 单元格格式_Java读写CSV格式的文件
- python没有库_python-嵌入没有标准库的Python3
- python的for语句怎么写_Python日常之——不要再写循环了!