zoukankan      html  css  js  c++  java
  • Linux:time

    1 时间类型。

    Linux下常用的时间类型有4个:time_t,struct timeval,struct timespec,struct tm。

    • time_t是一个长整型,一般用来表示用1970年以来的秒数。
    • truct timeval有两个成员,一个是秒,一个是微妙。
    struct timeval
    {
        long tv_sec;
        long tv_usec;
    };
    
    • struct timespec有两个成员,一个是秒,一个是纳秒。
    struct timespec
    {
        time_t tv_sec;
        long tv_nsec;
    };
    
    • truct tm是直观意义上的时间表示方法:
    struct tm
    {
        int tm_sec;
        int tm_min;
        int tm_hour;
        int tm_mday;
        int tm_mon;
        int tm_year;
        int tm_wday;
        int tm_yday;
        int tm_isdst;
    };
    

    2 时间操作

    (1) 时间格式间的转换函数
    主要是 time_t、struct tm、时间的字符串格式之间的转换。看下面的函数参数类型以及返回值类型:

    char *asctime(const struct tm *tm);
    char *ctime(const time_t *timep);
    struct tm *gmtime(const time_t *timep);
    struct tm *localtime(const time_t *timep);
    time_t mktime(struct tm *tm);
    

    gmtime和localtime的参数以及返回值类型相同,区别是前者返回的格林威治标准时间,后者是当地时间。

    例子如下:

    复制代码
    #include <stdio.h>
    #include <time.h>
    int main(int argc, char *argv[]){
        time_t t = time(NULL);
        struct tm *gmt, *area;
        tzset();
        area = localtime(&t);
        printf ("Local time: %s", asctime(area));
        gmt = gmtime(&t);
        printf("GMT time: %s", asctime(gmt));
        return 0;
    }
    复制代码



    (2) 获取时间函数
    两个函数,获取的时间类型看原型就知道了:

    time_t time(time_t *t);
    int gettimeofday(struct timeval *tv, struct timezone *tz);
    

    前者获取time_t类型,后者获取struct timeval类型,因为类型的缘故,前者只能精确到秒,后者可以精确到微秒。

    3 延时函数

    主要的延迟函数有:sleep(),usleep(),nanosleep(),select(),pselect().

    unsigned int sleep(unsigned int seconds);
    void usleep(unsigned long usec);
    int nanosleep(const struct timespec *req, struct timespec *rem);
    int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,struct timeval *timeout);
    int pselect(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout, const sigset_t *sigmask);
    

    sleep指定秒级别的休眠,usleep指定毫秒级的休眠,nanosleep指定纳秒级别的休眠。

    alarm函数是信号方式的延迟,这种方式不直观,这里不说了。
    仅通过函数原型中时间参数类型,可以猜测sleep可以精确到秒级,usleep/select可以精确到微妙级,nanosleep和pselect可以精确到纳秒级。
    而实际实现中,linux上的nanosleep和alarm相同,都是基于内核时钟机制实现,受linux内核时钟实现的影响,并不能达到纳秒级的精度,man nanosleep也可以看到这个说明,man里给出的精度是:Linux/i386上是10 ms ,Linux/Alpha上是1ms。
    这里有一篇文章http://blog.csdn.net/zhoujunyi/archive/2007/03/30/1546330.aspx,
    测试了不同延迟函数之间的精确度。文章给出的结论是linux上精度最高的是select,10ms级别。我在本机器测试select和pselect相当,都达到了1ms级的精度,精度高于文章中给出的10ms,sleep在秒级以上和usleep/nanosleep相当。下面贴下我机器上1ms时候的测试结果,其他不贴了:


    sleep 1000 0 -1000
    usleep 1000 2974 1974
    nanosleep 1000 2990 1990
    select 1000 991 -9
    pselect 1000 990 -10
    gettimeofday 1000 1000 0
    而使用gettimeofday循环不停检测时间,可精确微秒级,不过不适宜用来做定时器模块。
    因此后面的定时器模块将选择select为延迟函数。

    Author: visayafan <visayafan@gmail.com>

    Date: 2011-12-10 17:27:09


    原文网址:http://www.cnblogs.com/visayafan/archive/2011/12/10/2283431.html


  • 相关阅读:
    JAVA基础——编程练习(二)
    JAVA基础——面向对象三大特性:封装、继承、多态
    JVM内存
    50. Pow(x, n) (JAVA)
    47. Permutations II (JAVA)
    46. Permutations (JAVA)
    45. Jump Game II (JAVA)
    43. Multiply Strings (JAVA)
    42. Trapping Rain Water (JAVA)
    41. First Missing Positive (JAVA)
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218536.html
Copyright © 2011-2022 走看看