linux下时间和定时器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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");