三种不同精度的睡眠

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) --时间与定时器的更多相关文章

  1. Linux信号实践(2) --信号分类

    信号分类 不可靠信号 Linux信号机制基本上是从UNIX系统中继承过来的.早期UNIX系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,它的主要问题是: 1.进程每次处理信号后,就将对信号 ...

  2. Linux信号实践(4) --可靠信号

    Sigaction #include <signal.h> int sigaction(int signum, const struct sigaction *act, struct si ...

  3. Linux信号实践(1) --Linux信号编程概述

    中断 中断是系统对于异步事件的响应, 进程执行代码的过程中可以随时被打断,然后去执行异常处理程序; 计算机系统的中断场景:中断源发出中断信号 -> CPU判断中断是否屏蔽屏蔽以及保护现场 -&g ...

  4. Linux信号实践(3) --信号内核表示

    信号在内核中的表示 执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending).进程可以选择阻塞(Block)某个信号.被阻塞的信号产生时将保持在未 ...

  5. Linux驱动实践:中断处理函数如何【发送信号】给应用层?

    作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...

  6. Linux信号(signal) 机制分析

    Linux信号(signal) 机制分析 [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核 ...

  7. 非常好的一篇对linux信号(signal)的解析 (转载)【转】

    转自:https://blog.csdn.net/return_cc/article/details/78845346 Linux信号(signal) 机制分析 转载至:https://www.cnb ...

  8. Linux信号机制

    Linux信号(signal) 机制分析 [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核 ...

  9. Linux信号(signal) 机制分析(转)

    [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核对于信号的处理流程包括信号的触发/注册/执 ...

随机推荐

  1. python 常用镜像

    pip镜像https://pypi.tuna.tsinghua.edu.cn/simplehttps://pypi.douban.io.com/simple pip install python-qt ...

  2. Node.js JXcore 打包

    Node.js 是一个开放源代码.跨平台的.用于服务器端和网络应用的运行环境. JXcore 是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线 ...

  3. Node.js 教程

    简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一个事件驱动I/O服务端Ja ...

  4. webpack 命令行 传入自定义变量

    https://github.com/webpack/webpack/issues/2254 --env 变量 Yes this is intended. Custom argumens can be ...

  5. Linux 性能监测:IO

    磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作,比如转轴.寻轨等.访问硬盘和访问内存之间的速度差别是以数量级来计算的,就 ...

  6. springMVC源码分析--HandlerMethod

    在之前的博客中我们已经接触过HandlerMethod,接下来我们简单介绍一下HandlerMethod,简单来说HandlerMethod包含的信息包括类.方法和参数的一个信息类,通过其两个构造函数 ...

  7. 关于ROS学习的一些反思

    距离发布上一篇ROS的博客已经过去两年了,才发现原来自己已经这么久可没有写过关于ROS的文章,想来很是惭愧.这两年时间,自己怀着程序员的梦想,研究过RTOS,探索过Linux,编写过Android应用 ...

  8. Android Framework 学习和需要学习的内容

    1. 之前的研究太偏向应用层功能实现了,很多原理不了解没有深究,现在研究framework面存一些资料待有空查看. 2.Android系统的层次如下: 3.项目目录简单分析如下: 4.telphony ...

  9. Hibernate通过SQL查询常量时只能返回第一个字符的解决方法

    在Hibernate中如果通过 [java] view plaincopy session.createSQLQuery("select '合计' as name from dual&quo ...

  10. Effective C++ ——设计与声明

    条款18:让接口更容易的被使用,不易误用 接口设计主要是给应用接口的人使用的,他们可能不是接口的设计者,这样作为接口的设计者就要对接口的定义更加易懂,让使用者不宜发生误用,例如对于一个时间类: cla ...