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 si ...
- Linux信号实践(1) --Linux信号编程概述
中断 中断是系统对于异步事件的响应, 进程执行代码的过程中可以随时被打断,然后去执行异常处理程序; 计算机系统的中断场景:中断源发出中断信号 -> CPU判断中断是否屏蔽屏蔽以及保护现场 -&g ...
- Linux信号实践(3) --信号内核表示
信号在内核中的表示 执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending).进程可以选择阻塞(Block)某个信号.被阻塞的信号产生时将保持在未 ...
- Linux驱动实践:中断处理函数如何【发送信号】给应用层?
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...
- Linux信号(signal) 机制分析
Linux信号(signal) 机制分析 [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核 ...
- 非常好的一篇对linux信号(signal)的解析 (转载)【转】
转自:https://blog.csdn.net/return_cc/article/details/78845346 Linux信号(signal) 机制分析 转载至:https://www.cnb ...
- Linux信号机制
Linux信号(signal) 机制分析 [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核 ...
- Linux信号(signal) 机制分析(转)
[摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核对于信号的处理流程包括信号的触发/注册/执 ...
随机推荐
- linux加入Windows域-------本人生产环境上线所用
为什么说要linux加域呢! 因为之前在公司是做vmware的,然后呢vmware的horizon桌面云虚拟化都是通过域来管理的,开始使用的都是Windows桌面,后来开发的人员说要使用linu ...
- 搭建一个交互式的前端构建环境.md
为了提高开发效率.减少重复的操作,现在几乎全部的前端项目都需要依赖一些构建工具来实现自动化打包,主流的有webpack, gulp, grunt等.加上各种各样的配置文件就会形成了一个相对复杂的构建环 ...
- POJ 放苹果问题(递归)
首先我们想象有一个函数count f(m,n)可以把m个苹果放到n个盘子中. 根据 n 和 m 的关系可以进一步分析: 特殊的m <=1|| n <= 1时只有一种方法: 当 m < ...
- python脚本批量生成数据
在平时的工作中,经常会遇到造数据,特别是性能测试的时候更是需要大量的数据.如果一条条的插入数据库或者一条条的创建数据,效率未免有点低.如何快速的造大量的测试数据呢?在不熟悉存储过程的情况下,今天给大家 ...
- Numpy函数学习--genfromtxt函数
genfromtxt函数 今天学习时遇到了genfromtxt函数 world_alcohol = numpy.genfromtxt("world_alcohol.txt",del ...
- 微信小程序实例-摇一摇抽奖
概述 前面我们讲了如何开始微信小程序搭建和一些组件的介绍.微信小组件和微信小程序入门 微信小程序目录 为了更好的理解小程序和小程序开发,我们首先来看一下项目的目录. 首先看下根目录下的app.json ...
- activiti实战系列 排他网关(ExclusiveGateWay)
流程图 12.2:部署流程定义+启动流程实例 12.3:查询我的个人任务 12.4:完成我的个人任务 说明: 1) 一个排他网关对应一个以上的顺序流 2) 由排他网关流出的顺序流都有个 ...
- ROS_Kinetic_x 目前已更新的常用機器人資料 rosbridge agvs pioneer_teleop nao TurtleBot
Running Rosbridge Description: This tutorial shows you how to launch a rosbridge server and talk to ...
- XMPP系列(七)---获取群组列表
上一篇介绍了如何创建群组,这一篇就介绍一下,如何获取自己的群组列表. 在上一篇有提到,如果我们创建的群组是公共的群组,那么获取自己的群组列表时,会获取到自己的群组列表和那些公共的群组.而实际做社交的应 ...
- 指令汇B新闻客户端开发(一) 新手引导页开发
首先做开发的时候应该有一个闪屏页面和新手引导页, 我相信闪屏页面大家应该都会了,那么先看到新手引导页了. 我们可以看到这其实是一个ViewPager,我们也可以看到这是3个引导页,那么首先来看一下布局 ...