首页 > 系统服务 > 详细

Linux System Programming 学习笔记(十一) 时间

时间:2014-06-03 08:10:12      阅读:465      评论:0      收藏:0      [点我收藏+]

1. 内核提供三种不同的方式来记录时间:

Wall time (or real time):actual time and date in the real world
Process time:the time that a process spends executing on a processor 包括用户时间user time 和 系统时间system time
Monotonic time:use the system‘s uptime (time since boot) for this purpose,guarantee that the time source is strictly linearly increasing
 
Unix表示绝对时间:the number of elapsed seconds since the epoch, which is defined as 00:00:00 UTC on the morning of 1 January 1970
 
On Linux, the frequency of the system timer is called HZ,The value of HZ is architecture-specific 
POSIX functions that return time in terms of clock ticks use CLOCKS_PER_SEC to represent the fixed frequency
 
2. 时间表示的数据结构
 
原始表示:
typedef long time_t;
That won‘t last long before overflowing!
 
微秒级精度表示:
#include <sys/time.h>
struct timeval {
        time_t       tv_sec;     /* seconds */
        suseconds_t  tv_usec;    /* microseconds */
};
纳秒级精度表示:
#include <time.h>
struct timespec {
        time_t  tv_sec;       /* seconds */
        long    tv_nsec;      /* nanoseconds */
};

 

3. 获取当前时间

#include <time.h>
time_t time (time_t *t);

time() returns the current time represented as the number of seconds elapsed since the epoch

 

#include <sys/time.h>
int gettimeofday (struct timeval *tv, struct timezone *tz);
gettimeofday() places the current time in the timeval structure pointed at by tv and returns 0
参数tz总是为NULL
 
bubuko.com,布布扣
struct timeval tv;
int ret;
ret = gettimeofday (&tv, NULL);
if (ret)
        perror ("gettimeofday");
else
        printf ("seconds=%ld useconds=%ld\n", (long) tv.sec, (long) tv.tv_usec);
bubuko.com,布布扣

 

bubuko.com,布布扣
#include <sys/times.h>
struct tms {
        clock_t tms_utime;   /* user time consumed */
        clock_t tms_stime;   /* system time consumed */
        clock_t tms_cutime;  /* user time consumed by children */
        clock_t tms_cstime;  /* system time consumed by children */
};
clock_t times (struct tms *buf);
bubuko.com,布布扣
User time is the time spent executing code in user space.
System time is the time spent executing code in kernel space.
 
 
4. 设置当前时间
#include <time.h>
int stime (time_t *t);

#include <sys/time.h>
int settimeofday (const struct timeval *tv, const struct timezone *tz);

参数tz总是为NULL

struct timeval tv = { 31415926, 27182818 };
int ret;
ret = settimeofday (&tv, NULL);
if (ret)
        perror ("settimeofday");
 
5. sleep休眠
/*  puts the invoking process to sleep for the number of seconds  */
#include <unistd.h>
unsigned int sleep (unsigned int seconds);

 

/*  usleep() puts the invoking process to sleep for usec microseconds */
#define _XOPEN_SOURCE 500
#include <unistd.h>
int usleep (unsigned int usec);
#include <sys/select.h>
int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

select函数将参数n设为0,三个检测事件集合全设为NULL,这时select就等同于一个精确时间的休眠函数,而且这种用法最具有可移植性

struct timeval tv = { .tv_sec = 0, .tv_usec = 757 };
select (0, NULL, NULL, NULL, &tv);

 

6. 定时器
Timers provide a mechanism for notifying a process when a given amount of time elapses
 
简单定时器:
#include <unistd.h>
unsigned int alarm (unsigned int seconds);

schedules the delivery of a SIGALRM signal to the invoking process after seconds of real time have elapsed

bubuko.com,布布扣
void alarm_handler (int signum)
{
        printf ("Five seconds passed!\n");
}
void func (void)
{
        signal (SIGALRM, alarm_handler);
        alarm (5);
        pause ();
}
bubuko.com,布布扣

间隔定时器:

bubuko.com,布布扣
#include <sys/time.h>
int getitimer (int which, struct itimerval *value);
int setitimer (int which, const struct itimerval *value, struct itimerval *ovalue);

struct itimerval {
        struct timeval it_interval;  /* next value */
        struct timeval it_value;     /* current value */
};

struct timeval {
        long tv_sec;   /* seconds */
        long tv_usec;  /* microseconds */
};
bubuko.com,布布扣
bubuko.com,布布扣
void alarm_handler (int signo)
{
        printf ("Timer hit!\n");
}
void foo (void)
{
        struct itimerval delay;
        int ret;
        signal (SIGALRM, alarm_handler);
        delay.it_value.tv_sec = 5;
        delay.it_value.tv_usec = 0;
        delay.it_interval.tv_sec = 1;
        delay.it_interval.tv_usec = 0;
        ret = setitimer (ITIMER_REAL, &delay, NULL);
        if (ret) {
                perror ("setitimer");
                return;
        }
        pause ();
}
bubuko.com,布布扣

 

 

Linux System Programming 学习笔记(十一) 时间,布布扣,bubuko.com

Linux System Programming 学习笔记(十一) 时间

原文:http://www.cnblogs.com/wwwjieo0/p/3760781.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!