Linux信号实践(5) --时间与定时器
三种不同精度的睡眠
1.sleep
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
RETURN VALUE
Zero if the requested time has elapsed, or the number of seconds left to sleep,
if the call was interrupted by a signal handler.
//示例
int sleepTime = 5;
do
{sleepTime = sleep(sleepTime);
}
while (sleepTime > 0);
2.usleep(以微秒为单位)
int usleep(useconds_t usec);
The type useconds_t is an unsigned integer type capable of holding integers in the range [0,1000000].
Programs will be more portable if they never mention this type explicitly.
3.nanosleep(以纳秒为单位)
#include <time.h>
int nanosleep(const struct timespec *req, struct timespec *rem);
req指定睡眠的时间, rem返回剩余的睡眠时间
struct timespec
{time_t tv_sec; /* seconds: 秒 */long tv_nsec; /* nanoseconds: 纳秒 */
};
三种时间结构
time_t
struct timeval {long tv_sec; /* seconds */long tv_usec; /* microseconds 微秒*/
};
struct timespec {time_t tv_sec; /* seconds */long tv_nsec; /* nanoseconds */
};
setitimer
#include <sys/time.h>
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));
setitimer()比alarm功能强大,支持3种类型的定时器
参数
第一个参数which指定定时器类型
第二个参数是请求的时间
第三个参数是定时器原来所关联的值
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: 微秒 */
};
which值
ITIMER_REAL: 经过指定的时间后,内核将发送SIGALRM信号给本进程 (用的较多)
ITIMER_VIRTUAL : 程序在用户空间执行指定的时间后,内核将发送SIGVTALRM信号给本进程
ITIMER_PROF : 进程在内核空间中执行时,时间计数会减少,通常与ITIMER_VIRTUAL共用,代表进程在用户空间与内核空间中运行指定时间后,内核将发送SIGPROF信号给本进程。
/**示例1:
1.在启动进程的5秒之后产生信号
2.然后每隔1秒产生一次信号
**/
int main()
{if (signal(SIGALRM, signalAction) == SIG_ERR)err_exit("signal error");struct itimerval it;struct timeval it_interval = {1, 0};struct timeval it_value = {5, 0};it.it_interval = it_interval;it.it_value = it_value;if (setitimer(ITIMER_REAL, &it, NULL) == -1)err_exit("setitimer error");while (true)pause();
}
/**示例2:
获取itimerval 结构体
**/
int main()
{struct itimerval it;struct timeval it_interval = {1, 0};struct timeval it_value = {5, 0};it.it_interval = it_interval;it.it_value = it_value;if (setitimer(ITIMER_REAL, &it, NULL) == -1)err_exit("setitimer error");for (int i = 0; i < 100000; ++i);struct itimerval oldIt;// if (setitimer(ITIMER_REAL, &it, &oldIt) == -1)
// err_exit("setitimer error");// 在不重新设置时钟的情况下获取剩余时间if (getitimer(ITIMER_REAL, &oldIt) == -1)err_exit("getitimer error");cout << oldIt.it_interval.tv_sec << ' ' << oldIt.it_interval.tv_usec<< ' ' << oldIt.it_value.tv_sec << ' ' << oldIt.it_value.tv_usec << endl;
}
附:秒-微秒-纳秒的转换
S(秒)、ms(毫秒)、μs(微秒)、ns(纳秒),其中:1s=1000ms,1 ms=1000μs,1μs=1000ns
Linux信号实践(5) --时间与定时器相关推荐
- Linux信号实践(2) --信号分类
信号分类 不可靠信号 Linux信号机制基本上是从UNIX系统中继承过来的.早期UNIX系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,它的主要问题是: 1.进程每次处理信号后,就将对信号 ...
- Linux信号实践(4) --可靠信号
Sigaction #include <signal.h> int sigaction(int signum, const struct sigaction *act,struct sig ...
- Linux信号实践(1) --Linux信号编程概述
中断 中断是系统对于异步事件的响应, 进程执行代码的过程中可以随时被打断,然后去执行异常处理程序; 计算机系统的中断场景:中断源发出中断信号 -> CPU判断中断是否屏蔽屏蔽以及保护现场 -&g ...
- Linux信号实践(3) --信号内核表示
信号在内核中的表示 执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending).进程可以选择阻塞(Block)某个信号.被阻塞的信号产生时将保持在未 ...
- linux上点时间延时,Linux上时间和定时器
Linux下时间和定时器 http://blog.chinaunix.net/u1/35065/showart_1870601.html重点读了第三种方法.文章写得很好,加了一点点注释可参考http: ...
- linux 时间与定时器编程原理,浅析 Linux 中的时间编程和实现原理-嵌入式-火龙果软件工程...
引子 我们都生活在时间中,但却无法去思考它.什么是时间呢?似乎这是一个永远也不能被回答的问题.然而作为一个程序员,在工作中,总有那么几次我必须思考什么是时间.比如,需要知道一段代码运行了多久:要在 l ...
- linux信号子系统,Linux时间子系统之(三):用户空间接口函数
Linux时间子系统之(三):用户空间接口函数 作者:linuxer 发布于:2014-12-24 15:48 分类:时间子系统 一.前言 从应用程序的角度看,内核需要提供的和时间相关的服务有三种: ...
- Linux时间、定时器、时间中断超时处理
内核时间管理 Linux内核计时.延时函数与内核定时器 内核通过定时器(timer)中断来跟踪时间流 硬件定时器以周期性的间隔产生时间中断,这个间隔(即频率)由内核根据HZ来确定,HZ是一个与体系结构 ...
- linux信号(signal) 机制分析
1 信号本质 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的. ...
最新文章
- ubuntu-18.04 root登录图形界面失败问题解决方案
- 使用Cucumber+Rspec玩转BDD(7)——测试重构
- html 静态资源缓存时间,.htaccess设置静态资源缓存(即浏览器缓存)
- python中dump用法_python中json庫中的load、loads、dump、dumps的區別與用法
- [wp7游戏]wp7~~超级血腥类游戏~~集合贴~~
- 大型情感剧集Selenium:6_selenium中的免密登陆与cookie操作 #华为云·寻找黑马程序员#
- dedecms 5.7 站点文件从本地子目录上传到远程根目录后找不到模板的解决方案
- 保护计算机系统与数据有什么方法,电脑数据保护方法 看完保你不后悔
- 广日电梯主板灯说明_广日MAX电梯维修手册.pdf
- 加密的PDF文件如何解密?教你使用手机就能解密的方法
- Nginx服务器上安装SSL证书
- Tomcat访问localhost:8080直接跳转到项目首页
- 美女联系网站作者删除之前的写真照
- 《一周学完光线追踪》学习 十一点五 离焦模糊代码原理分析
- Opencv中BGR、YUV、YUV_I420\NV12分析
- 一篇博客教会你写序列化工具
- 脑裂是什么,zk是如何解决脑裂问题的
- 博世BOSCH EDI DESADV发货通知详解
- FD650B数码管驱动
- 汇编 SHL指令和SHR指令