linux下时间和定时器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、问题的提出

我们开发程序时,经常会遇到时间和定时器的问题,为了更好的使用时间和定时器,现在列举一个一些时间结构体、函数和定时器。

二、解决思路

1.时间类型

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

2)struct timeval有两个成员,一个是秒,一个是微妙。

struct timeval

{

long tv_sec; /* seconds */

long tv_usec; /* microseconds */

};

3) struct timespec有两个成员,一个是秒,一个是纳秒。

struct timespec

{

time_t tv_sec; /* seconds */

long tv_nsec; /* nanoseconds */

};

4) 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 */

};

5)

struct timeb

{

time_t time; //从1970来经过的秒数

unsigned short millitm; //毫秒

short timezone; //时区

short dstflag;//为日光节约时间的修正值,如果为非0代表启用日光节约修正};

6)

struct timezone

{

int tz_minuteswest;//和格林尼治时间相差多少分

int tz_dsttime;//日光节约时间的状态

};

日光节约时间:夏时制。

2.时间函数

1) char *asctime(const struct tm *timeptr)

将时间和日期以字符串格式显示。

2)clock_t clock(void)

取得进程占用cpu的大约时间。

3)char *ctime(const time_t *timep)

将时间和日期以字符串格式显示。

4) double difftime(time_t time1, time_t time0)

计算时间time1和time0间的差距。

5) int ftime(struct timeb *tp)

取得目前的时间和日期。

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

取得目前的时间。

7)strcut tm *gmtime(const time_t *timep)

time_t结构时间转tm结构时间,tm为UTC时区。

8) struct tm *localtime(const time_t *timep)

将time_t结构时间转tm结构时间,tm是当地时区。

9)time_t mktime(struct tm *timeptr)

将tm结构时间转换为time_t。

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

设置时间为tv,设置时区为tz。

11) size_t strftime(char *s, size_t max, const char *format, const struct tm *tm)

将参数tm的时间结构依照参数format所指定的字符串格式做转换,转换后的字符串将复制到参数s所指的字符串数组中,该字符串的最大长度为参数max所控制。

12) time_t time(time_t *t)

取得目前的时间,时间按照UTC。

13) void tzset(void)

从环境变量TZ取得目前当地的时间。

3.延迟函数

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

1) unsigned int sleep(unsigned int seconds)

延时seconds秒。

2) void usleep(int micro_seconds)

延时micro_seconds微妙

3) int nanosleep(const struct timespec *rqtp, struct timespec *rmtp)

延时的时间为rqtp,如果nansleep被信号中断,且rmtp不为NULL,则rmtp指定的位置上包含的就是剩余时间。

4) int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)

如果将readfds, writefds, exceptfds置为NULL,timeout为非零,则延时timeout。

5) int pselect(int maxfdp1, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec tsptr, const sigset_t *sigmask)

如果将readfds, writefds, exceptfds置为NULL,tsptr为非零,则延时tsptr。

3.定时器

1) unsigned int alarm(unsigned int seconds)

设置一个定时器,在seconds秒后超时,当定时器超时时,产生SIGALRM信号。如果不忽略或不捕捉此信号,则其默认动作是终止调用该alarm函数的进程,如果设置了SIGALRM信号处理函数,则会执行该信号处理函数。

每个进程只能有一个闹钟时钟。如果在调用alarm时,以前已为该进程设置过闹钟时钟,而且它还没有超时,则将该闹钟时钟的余留值作为本次alarm函数调用的值返回,以前登记的闹钟时钟则被新值代替。

例子:

void sigalrm_fn(int sig)

{

printf("alarm!\n");

相关文档
最新文档