IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

linux时间相关结构体和函数整理

Yunjie Blog 2012-08-15 13:38:33 累计浏览 3,491 次
本机暂存

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

     (1) time_t是一个长整型,一般用来表示用1970年以来的秒数.

     该类型定义在中.

     一般通过 time_t time = time(NULL); 获取.

     (2) struct timeb结构: 主要有两个成员, 一个是秒, 另一个是毫秒, 精确度为毫秒.

struct timeb
{
    time_t time;
    unsigned short millitm;
    short timezone;
    short dstflag;
};

     由函数int ftime(struct timeb *tp); 来获取timeb. 成功返回0, 失败返回-1.

     (3) struct timeval有两个成员,一个是秒,一个是微妙.

struct timeval 
{
    long tv_sec; /* seconds */
    long tv_usec; /* microseconds */
};

     由int gettimeofday(struct timeval *tv, struct timezone *tz);获取. struct timezone结构的定义为:

struct timezone
{
   int tz_minuteswest; /* 和Greewich时间差了多少分钟*/
   int tz_dsttime; /* 日光节约时间的状态 */
};

     (4) struct timespec有两个成员,一个是秒,一个是纳秒, 所以最高精确度是纳秒.

struct timespec
{
    time_t tv_sec; /* seconds */
    long tv_nsec; /* nanoseconds */
};

     一般由函数long clock_gettime (clockid_t which_clock, struct timespec *tp); 获取.

     获取特定时钟的时间,时间通过tp结构传回,目前定义了6种时钟,分别是   

                CLOCK_REALTIME                                         系统当前时间,从1970年1.1日算起

                CLOCK_MONOTONIC                                    系统的启动时间,不能被设置

                CLOCK_PROCESS_CPUTIME_ID               进程运行时间

                CLOCK_THREAD_CPUTIME_ID                 线程运行时间

                CLOCK_REALTIME_HR                                CLOCK_REALTIME的高精度版本

                CLOCK_MONOTONIC_HR                           CLOCK_MONOTONIC的高精度版本

     获取特定时钟的时间精度:

     long clock_getres(clockid_t );

     设置特定时钟的时间:

     long clock_settime(clockid_t ,struct timespec*);

     休眠time中指定的时间,如果遇到信号中断而提前返回,则由left_time返回剩余的时间:

     long clock_nanosleep(clockid_t ,int flag,timespec* time,timespec* left_time);

     (5) clock_t类型, 由clock_t clock(); 返回获取. 表示进程占用的cpu时间. 精确到微秒.

     (6) struct tm是直观意义上的时间表示方法:

struct tm 
{
    int tm_sec; /* seconds */
    int tm_min; /* minutes */
    int tm_hour; /* hours */
    int tm_mday; /* day of the month */
    int tm_mon; /* month */
    int tm_year; /* year */
    int tm_wday; /* day of the week */
    int tm_yday; /* day in the year */
    int tm_isdst; /* daylight saving time */
};

     struct tm* gmtime(const time_t *timep);

     struct tm* localtime(const time_t *timep);

     time_t mktime(struct tm *tm);

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

     注意: 这边三个函数都是线程不安全的, 要使用线程安全的版本, 需要使用带_r的版本 — gmtime_r, localtime_r, mktime_r.

     二、 延迟函数

     主要的延迟函数有: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);

     alarm函数是信号方式的延迟,这种方式不直观,这里不说了。 仅通过函数原型中时间参数类型,可以猜测sleep可以精确到秒级,usleep/select可以精确到微妙级,nanosleep和pselect可以精确到纳秒级。 而实际实现中,linux上的nanosleep和alarm相同,都是基于内核时钟机制实现,受linux内核时钟实现的影响,并不能达到纳秒级的精度,man nanosleep也可以看到这个说明,man里给出的精度是:Linux/i386上是10 ms ,Linux/Alpha上是1ms

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. Linux如何统计进程的CPU利用率 (累计阅读 16,308)
  2. 我的 RHCA 之路 (累计阅读 14,013)
  3. Linux内存点滴 用户进程内存空间 (累计阅读 13,230)
  4. 给程序员新手的一些建议 (累计阅读 13,089)
  5. Linux 性能监控、测试、优化工具 (累计阅读 13,011)
  6. 关于linux内存free的一些事情 (累计阅读 12,867)
  7. ps - 按进程消耗内存多少排序 (累计阅读 12,688)
  8. Google怎么用linux (累计阅读 12,581)
  9. Linux Used内存到底哪里去了? (累计阅读 11,868)
  10. find命令的一点注意事项 (累计阅读 11,866)