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内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核对于信号的处理流程包括信号的触发/注册/执 ...
随机推荐
- FastReport报表MVC显示步骤
FastReport报表MVC使用步骤如下: 1.创建MVC网站项目 最终DEMO如下图所示 2.引用相关DLL FastReport.dll FastReport.Web.dll 3.Web.con ...
- 去除html标记和替换script标记
1: /// <summary> 2: /// 去除HTML标记 3: /// </summary> 4: /// <param name="NoHTML&qu ...
- 使用ffmpeg转码时遇到aac报错
今天尝试用ffmpeg转一个视频的格式,结果报出这个错误: The encoder 'aac' is experimental but experimental codecs are not enab ...
- JMeter(十三)-代理服务器录制脚本
今天重点说一下jmeter如何利用自身的代理服务器录制脚本 1:工作台下创建代理服务器 2:配置代理,选择录制控制器 3:在Requests FIltering下添加排除模式,配置正则表达式.否则会录 ...
- ZooKeeper之(六)应用实例
6.1 Java API 客户端要连接 Zookeeper服务器可以通过创建 org.apache.zookeeper.ZooKeeper 的一个实例对象,然后调用这个类提供的接口来和服务器交互. Z ...
- git 覆盖本地变化
git fetch && git reset --hard origin/master
- Java集合框架总结
java集合框架主要分为实现了Collection接口的List和Set.映射接口Map. |-- List 有序,元素都有索引,可重复. |-- Set 无序,不可以存储重复的元素. |-- Map ...
- Android自定义底部带有动画的Dialog
Android自定义底部带有动画的Dialog 效果图 先看效果图,是不是你想要的呢 自定义Dialog package --.view; import android.app.Dialog; imp ...
- Programming In Scala笔记-第十六章、Scala中的List
本章主要分析Scala中List的用法,List上可进行的操作,以及需要注意的地方. 一.List字面量 首先看几个List的示例. val fruit = List("apples&quo ...
- IMDG产品功能扩展
开源IMDG通常都提供了SPI或其他接口,供用户自行扩展.以Hazelcast为例,我们可以用一些好玩的小工具增强其查询.Map和后端持久化的功能.这些小工具虽然看起来很小,但功能也非常强大. SQL ...