`
simohayha
  • 浏览: 1404083 次
  • 性别: 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

    根据提供的文件信息,我们可以深入探讨Linux环境下与时间处理相关的几个关键函数:`asctime()`, `ctime()`, `gettimeofday()`, 和 `gmtime()`。这些函数不仅在Linux中可用,在Windows系统中也有相应的实现,因此了解...

    NI CompactRIO支持最新的 Linux Real-Time实时操作系统,满足您的嵌入式应用需求.zip

    Linux Real-Time是一种经过优化的Linux版本,特别针对实时性能进行了改进,能够在确定性的时间内处理任务,这对于需要即时响应的嵌入式系统至关重要。 首先,我们来了解一下Linux Real-Time的优势。与传统的Linux...

    linux-time.rar_LINUX TIME _Time

    Linux时间API提供了丰富的接口供应用程序处理时间,如`gettimeofday()`、`time()`、`clock_gettime()`等。这些函数允许程序员获取系统时间、进程时间或者高精度时间戳。 2. **`gettimeofday()`**: 这个函数返回...

    Linux 应用程序connect timeout原因

    ### Linux 应用程序 Connect Timeout 原因详解 #### 背景介绍 在Linux环境中,当应用程序遇到“connect timeout”错误时,这通常意味着数据传输或接收过程中出现了问题,尤其是在TCP/IP通信中。此类错误往往使得...

    linux-time.rar_Time

    "linux-time.rar_Time"这个压缩包可能包含了关于Linux内核和用户空间中时间API实现的详细代码和文档,其中"linux-time.c"是源代码文件。下面将详细讨论Linux时间API的重要性和其主要功能。 1. **时间API的重要性** ...

    linux报文处理全流程.pdf

    因此,Linux引入了软中断来处理网络接收事件,尤其是针对高负载下的小包处理场景。 #### 三、软中断处理与驱动 ##### 3.1 软中断处理 在Linux内核中,NET_RX_SOFTIRQ是一种专门用于处理网络接收事件的软中断。它...

    Linux For Embedded And Real-Time Applications

    《Linux For Embedded And Real-Time Applications》这本书深入探讨了Linux操作系统如何被有效地应用于嵌入式系统以及实时系统中。首先,我们需要理解什么是嵌入式系统和实时系统。 **嵌入式系统**是指那些专门设计...

    ipv4_linux内核skb处理流程图_

    总结来说,Linux内核中的skb处理流程是一个复杂而精细的过程,涉及了网络协议栈的各个层次,确保了数据包从网络到应用的正确传输。通过理解这一流程,开发者能更好地优化网络应用性能,排查问题,以及实现特定的网络...

    [服务器性能优化]Linux下高并发socket最大连接数和sysctl(time_wait)设置

    本文将深入探讨如何优化Linux下的socket连接数以及如何调整sysctl参数,特别是time_wait状态的影响。这有助于提升服务器处理大量并发请求的能力,确保服务的稳定性和响应速度。 首先,我们需要了解socket连接数的...

    Linux for Embedded and Real-time Applications

    这些补丁优化了Linux内核的延迟,减少了中断处理时间,提高了系统的确定性和响应速度。 #### 内存管理 Linux提供了先进的内存管理机制,能够有效利用有限的物理内存,通过虚拟内存技术和缓存策略,即使在资源受限...

    linux下的高并发处理select 和epoll

    在Linux系统中,处理高并发I/O事件时,select和epoll是两种常见的技术。本文将详细介绍这两种技术,以及它们在处理大量并发连接时的特点和优势。 首先,我们来看看`select`函数。`select`是一种古老的I/O多路复用...

    减少Linux服务器过多的TIME_WAIT

    在Linux服务器环境中,当TCP/IP连接关闭后,服务器端的...通过上述方法,可以有效地管理和减少Linux服务器上的TIME_WAIT状态连接,优化服务器性能,尤其是对于处理大量并发连接的服务器,如Squid,这些调整尤为重要。

    linux下USB驱动Sample代码

    本示例中的"linux下USB驱动Sample代码"就是一种用户空间驱动的实现,它允许用户在不涉及内核编译的情况下,对USB设备进行操作。这种驱动方式对于开发人员来说更加灵活,因为不需要处理复杂的内核模块编译和加载过程...

    [英文书籍]Linux for Embedded and Real-time Applications用于嵌入式和实时应用的Linux

    8. **实时性能优化**:讨论如何测量和提高Linux系统的实时性能,包括调度策略、中断处理和任务优先级。 9. **安全性与可靠性**:讨论在嵌入式系统中确保数据安全和系统可靠性的方法,如权限管理、防火墙和固件更新...

    LINUX 下C++ 获取系统时间和设置时间

    在Linux环境下,使用C++获取和设置系统时间是一项常见的任务,尤其在开发系统级程序时。本文将详细探讨如何利用C++在Linux中操作时间。 首先,我们需要了解Linux中的时间模型。在Linux中,时间主要分为两类:系统...

    Linux下的串口通信

    - **定时器**:可以使用Linux的定时器机制(如`timer_create()`、`timer_settime()`等)来设置定时发送数据。 - **信号处理**:定时器触发时,通常会产生一个信号,通过注册信号处理函数,可以在接收到信号时执行...

    linux内核协议栈TCP time_wait原理、优化、副作用1

    Linux内核协议栈中的TCP协议在处理连接关闭时,会进入一个特定的状态叫做time_wait。这个状态对于确保TCP连接的可靠性和避免旧连接与新连接混淆至关重要。在time_wait状态下,连接不会立即关闭,而是等待一段时间,...

    linux下c语言学习

    Linux提供了多种获取时间和日期的方法,包括 `time()`、`gettimeofday()` 等。 **2.4 信号处理** 信号是软件中断机制,用于通知进程发生某些事件。Linux提供了信号处理机制,包括发送信号、捕捉信号等。常见的信号...

Global site tag (gtag.js) - Google Analytics