`
simohayha
  • 浏览: 1386367 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

linux下的time处理

阅读更多
在内核中有3个不同的时间:

Wall time(real time), Process time和Monotonic time.

Wall time,也就是rtc时钟。

Process time,进程执行的时间。

Monotonic time,也就是系统从boot后到当前的时间。

表示时间的数据结构:

typedef __timer_t timer_t;

struct timeval
   {
    __time_t tv_sec;            /* Seconds.  */
      __suseconds_t tv_usec;      /* Microseconds.  */
   };

 struct timespec
{
  __time_t tv_sec;            /* Seconds.  */
  long int tv_nsec;           /* Nanoseconds.  */
 };


其中第三个最好,因为他能精确到纳秒。

上面的所能表示的是秒,我们有时需要更直观的表示,因此就有下面的数据结构;
struct tm
 {
 int tm_sec;                   /* Seconds.     [0-60] (1 leap second) */
   int tm_min;                   /* Minutes.     [0-59] */
int tm_hour;                  /* Hours.       [0-23] */
  int tm_mday;                  /* Day.         [1-31] */
 int tm_mon;                   /* Month.       [0-11] */
  int tm_year;                  /* Year - 1900.  */
  int tm_wday;                  /* Day of week. [0-6] */
 int tm_yday;                  /* Days in year.[0-365] */
  int tm_isdst;                 /* DST.         [-1/0/1]*/

 #ifdef  __USE_BSD
  long int tm_gmtoff;           /* Seconds east of UTC.  */
   __const char *tm_zone;        /* Timezone abbreviation.  */
 #else
  long int __tm_gmtoff;         /* Seconds east of UTC.  */
   __const char *__tm_zone;      /* Timezone abbreviation.  */
 #endif
 };



clock_getres这个函数得到不同时钟的精度,也就是时钟间隔:

int clock_getres(clockid_t clk_id, struct timespec *res);


  #include <stdio.h>
 #include <time.h>
 
 int main()
 {
     clockid_t clocks[]= {
          CLOCK_REALTIME,
         CLOCK_MONOTONIC,
          CLOCK_PROCESS_CPUTIME_ID,
          CLOCK_THREAD_CPUTIME_ID,
         (clockid_t) -1,
      };
  
      int i;
      for(i=0;clocks[i] != (clockid_t) -1;i++)
     {
         struct timespec res;
         int ret;
         ret = clock_getres(clocks[i],&res);
         if(ret)
             perror("clock_getres");
         else
             printf("clock = [%d],sec = [%ld],nsec = [%ld]\n",clocks[i],res.tv_sec,res.tv_nsec);
     }
     return 1;
 }


我的amd的cpu下,输出结果是这样的:

clock = [0],sec = [0],nsec = [4000250]
clock = [1],sec = [0],nsec = [4000250]
clock = [2],sec = [0],nsec = [1]
clock = [3],sec = [0],nsec = [1]


其中4000250刚好是0.04秒,也就是说x86的架构的系统时钟频率为250hz。。


得到当前的时间的函数:

extern time_t time (time_t *__timer) __THROW;

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

int clock_gettime(clockid_t clk_id, struct timespec *tp);



  #include <stdio.h>
 #include <time.h>
 
 int main()
 {
     clockid_t clocks[]= {
          CLOCK_REALTIME,
         CLOCK_MONOTONIC,
          CLOCK_PROCESS_CPUTIME_ID,
          CLOCK_THREAD_CPUTIME_ID,
         (clockid_t) -1,
      };
  
      int i;
      for(i=0;clocks[i] != (clockid_t) -1;i++)
     {
         struct timespec res;
         int ret;
         ret = clock_gettime(clocks[i],&res);
         if(ret)
             perror("clock_getres");
         else
             printf("clock = [%d],sec = [%ld],nsec = [%ld]\n",clocks[i],res.tv_sec,res.tv_nsec);
     }
     return 1;
 }


通过结果可以看出4个时钟的不同含义。比如CLOCK_REALTIME我们可以看到结果就是从1970年以来所经过的秒数。。


设置时间的函数和get差不多:

int stime(time_t *t);

int settimeofday(const struct timeval *tv, const struct timezone *tz);

int clock_settime(clockid_t clk_id, const struct timespec *tp);


这里要注意,在大部分系统我们设置时钟,只能设置CLOCK_REALTIME。。

这里还有一个更高级的函数:

#include <sys/timex.h>

       int adjtimex(struct timex *buf);


这个函数用来同步内核的时钟。具体的用法可以去看man。。

sleep的4个函数:

sleep
usleep
int nanosleep(const struct timespec *req, struct timespec *rem);
long sys_clock_nanosleep (clockid_t which_clock, int flags, const struct timespec *rqtp, struct timespec *rmtp);


sleep和usleep区别不大,一个是秒,一个是毫秒而已。

nanosleep和他们的区别是它使用纳秒,并且他不是用信号来实现的,因此建议使用nanosleep,而不要使用sleep和usleep。

而最后一个函数我们可以选择所取的时钟。。
4
0
分享到:
评论
3 楼 simohayha 2009-01-05  
pselect也能支持到纳秒的说。。。不过貌似有些unix平台不支持它。。
2 楼 simohayha 2009-01-05  
seen 写道

那啥,usleep/sleep可以用select来模拟,更准时
不过10毫秒以下的精度是达不到的


,恩,不过有了nanosleep的话就没必要用select了吧。。
1 楼 seen 2009-01-05  
那啥,usleep/sleep可以用select来模拟,更准时
不过10毫秒以下的精度是达不到的

相关推荐

    linux下用time(NULL)函数和localtime()获取当前时间的方法

    time(); 函数 函数原型: time_t time(time_t *timer) ... * 处理日期时间的函数都是以本函数的返回值为基础进行运算 * * 函数原型: * #include &lt;time&gt; * * time_t time(time_t *calptr); * * 返回

    linux下配置NTP架设本地时间服务器

    在linux下,我们可以通过自带的NTP(Network Time Protocol)协议通过网络使自己的系统保持精确的时间。 NTP是用来使系统和一个精确的时间源保持时间同步的协议。建议大家在自己管理的网络中建立至少一台时间服务器来...

    Linux Kernel CPUFreq Proc处理器整数处理漏洞.pdf

    Linux Kernel CPUFreq Proc处理器整数处理漏洞.pdf

    Linux下connect超时处理(总结)

    主要介绍了Linux下connect超时处理(总结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Linux网络编程 视频 教程

    Linux网络编程(总共41集) 讲解Linux网络编程知识,分以下四个篇章。 Linux网络编程之TCP/IP基础篇 Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP...

    实时调度Linux的调度机制

    我们可以把实时系统分为两类,一类是硬实时(Hard Real-Time) ;另外一类则是软实时(Soft Real-Time) 。 所谓硬实时是指如果系统对某个实时任务的处理未能在某 个截止时间开始或者结束的话,最终的结果将是灾难...

    C++教程网《Linux网络编程》视频百度云地址

    Linux网络编程(总共41集) 讲解Linux网络编程知识,分以下四个篇章。 Linux网络编程之TCP/IP基础篇 Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP...

    Linux下抓包工具tcpdump的Makefile(基于cmake)

    tcpdump [ -DenNqvX ] [ ...可以同时配合"-G time"选项使得输出文件每time秒就自动切换到另一个文件。可通过"-r"选项载入这些文件以进行分析和打印。 -r:从给定的数据包文件中读取数据。使用"-"表示从标准输入中读取。

    Linux操作系统的程序命令行处理分析

    几乎所有的GNU/Linux程序都遵循一些同样的命令行解释习惯,程序的参数通常 分为了两大类:选项(option)或者一些标志(flag)、其他参数。选项(option)主要是提供给程序一些运行上的选择,而其他参数则通常是提 供给...

    c++教程网的linux网络编程视频下载

    Linux网络编程(总共41集) 讲解Linux网络编程知识,分以下四个篇章。 Linux网络编程之TCP/IP基础篇 Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP...

    linux操作系统内核技术-uestc课件

     5熟悉在x86体系结构上Linux中断和异常的处理原理,中断注册、共享、控制,和中断上下文的意义,中断和设备驱动程序的关系,以及设备驱动程序结构和用户接口。(4小时)  6中断处理程序被分解为top half和bottom ...

    understanding linux network internals

    深入理解Linux网络内幕(英文) If you've ever wondered how Linux carries out the complicated tasks assigned to it by the IP protocols -- or if you just want to learn about modern networking through ...

    linux sh脚本隐藏二进制文件

    # &gt; Created Time: 2018年04月15日 星期日 02时00分31秒 #************************************************************************/ 以压缩文件形式将二进制可执行文件添加到该脚本末尾 tar -zcvm SOFT_NAME &gt;&gt; ...

    linux网络编程

    Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02TCPIP基础(二) 最大传输单元(MTU)/路径MTU 以太网帧格式 ICMP ARP RARP 03TCPIP基础...

    Linux高性能服务器编程清晰PDF+源码

    1.6.2 Linux下访问DNS服务 1.6.3 使用tcpdump观察DNS通信过程 1.7 socket和TCPIP协议族的关系 第2章 IP协议详解 2.1 IP服务的特点 2.2 IPv4头部结构 2.2.1 IPv4头部结构 2.2.2 使用tcpdump观察IPv4...

    Linux聊天室 -- select && 多线程实现

    采用I/O复用技术select实现socket通信,采用多线程负责每个客户操作处理,完成Linux下的多客户聊天室! OS:Ubuntu 15.04 IDE:vim gcc make DB:Sqlite 3 Time:2015-12-09 ~ 2012-12-21 项目功能架构: 1. ...

    Linux操作系统基础教程

    一.Linux下的网络服务.......................................................................................................24 二.几种重要的配置文件......................................................

    Linux tftp命令用法详解

    Linux tftp命令 ...verbose:显示详细的处理信息 trace:显示包路径 status:显示当前状态信息 binary:二进制传输模式 ascii:ascii 传送模式 rexmt:设置包传输的超时时间 timeout:设置重传的超时时间 h

Global site tag (gtag.js) - Google Analytics