zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    HDU 2822 Dogs【两次bfs】
    HDU 2819 Swap【二分图|启发题】
    HDU 2818 Building Block【并查集+根节点偏移量】
    HDU 2817 A sequence of numbers【水题|快速幂】
    Linux内核分析--操作系统是如何工作的
    讲座感想
    用eclipse开发和调试postgresql-8.4.1
    Ubuntu 14.04下翻译软件的安装与比较
    Linux下autoconf和automake使用
    github 使用网址
  • 原文地址:https://www.cnblogs.com/itrena/p/5926967.html
Copyright © 2011-2022 走看看