1. time_t
time_t记录自1970年1月1日凌晨以来的秒数,在Linux/Unix上定义为long int类型,在32位系统上,time_t最多只能记录2,147,483,647秒,也就是说到了2038年将会产生溢出,但在64位系统上不会出现此问题。
time_t time(time_t *t);例子如下:
#include <stdio.h> #include <time.h> int main(void) { time_t sec; sec = time(NULL); printf("%ld\n", sec); return 0; }time函数返回自1970年1月1日凌晨以来的秒数,参数t可以为NULL。同时还提供了一个函数difftime,原型如下:
double difftime(time_t time1, time_t time0);用于比较两个time_t类型的值。
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 */ }; ----------------------------------------------------------------- tm_sec | 秒,范围是0~59。 tm_min | 分,范围是0~59。 tm_hour | 时,范围是0~23。 tm_mday | 日,范围是1~31。 tm_mon | 月,范围是0~11,注意是0到11。 tm_year | 年,自1900以来的年数。 tm_wday | 星期几,从星期天开始计算,范围是0~6。 tm_yday | 一年中的哪一天,0~365。 tm_isdst | 夏令时间(DST)的一个标志。 -----------------------------------------------------------------
struct tm *gmtime(const time_t *timep); struct tm *localtime(const time_t *timep);例子如下:
#include <stdio.h> #include <time.h> int main(void) { const char *const days[] = {"星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; time_t sec; struct tm *n; sec = time(NULL); n = localtime(&sec); printf("%d年 %d月 %d日 %s %d:%d:%d\n", n->tm_year + 1900, n->tm_mon + 1, n->tm_mday, days[n->tm_wday], n->tm_hour, n->tm_min, n->tm_sec); return 0; }那么gmtime和localtime两个函数有什么不同的呢,gmtime获取的是UTC时间,localtime获取的是当前系统的时间。
char *ctime(const time_t *timep); char *asctime(const struct tm *tm);例子如下:
#include <stdio.h> #include <time.h> int main(void) { time_t sec; sec = time(NULL); printf("%s\n", ctime(&sec)); return 0; }上面程序执行结果如下:
//2015.08.12 add
注意:ctime函数的返回的字符串是静态分配的,下次调用ctime函数会将其覆盖,所以在打印时需要注意一下,例如下面这样的打印语句只能得到一个结果值:
printf("%s %s", ctime(&time1), ctime(&time2));
必须分开打印,asctime函数也是一样的。
time_t mktime(struct tm *tm);
struct timeval {struct timeval结构类型提供了一个微秒级成员tv_usec,它的类型同样是一个整型类型。time_t tv_sec; /* seconds */ suseconds_t tv_usec; /* microseconds */ };
#include <stdio.h> #include <sys/time.h> int main(void) { struct timeval tv; int ret; ret = gettimeofday(&tv, NULL); if (ret) { perror("gettimeofday"); } else { printf("seconds=%ld useconds=%ld\n", (long)tv.tv_sec, (long)tv.tv_usec); } return 0; }gettimeofday函数如果获取失败,返回-1值,同时设置errno为EFAULT。
int stime(time_t *t); int settimeofday(const struct timeval *tv, const struct timezone *tz);只是settimeofday设置的时间比stime更精确罢了。
unsigned int sleep(unsigned int seconds); int usleep(useconds_t usec);sleep用于睡眠多少秒,而usleep为睡眠多少微妙。
#include <stdio.h> #include <unistd.h> #include <signal.h> void alarm_handler(int signum) { printf("Five seconds passed!\n"); } void func(void) { signal(SIGALRM, alarm_handler); alarm(5); pause(); } int main(void) { func(); return 0; }程序将在5秒之后执行alarm_handler函数,这里还使用了pause函数,用于挂起进程直到捕捉到一个信号时才退出。注意alarm一次只能发送发送一个信号,如果要再次发送信号,需要重新调用alarm函数。
int setitimer(int which, const struct itimerval *restrict value, struct itimerval *restrict ovalue); int getitimer(int which, struct itimerval *value);需要包含头文件sys/time.h
ITIMER_REAL 按实际时间记时,时间到了之后发送SIGALRM信号,相当于alarm。 ITIMER_VIRTUAL 仅当进程执行时才进行记时,发送SIGVTALRM信号。 ITIMER_PROF 当进程执行时和系统执行该进程时都记时,发送的是SIGPROF信号。
struct itimerval { struct timerval it_interval; /* next value */ struct timerval it_value; /* current value */ };struct timeval结构前面都见过了,这里就不再描述了。
#include <stdio.h> #include <unistd.h> #include <signal.h> #include <sys/time.h> 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 = 1; 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; } while (1); } int main(void) { foo(); return 0; }程序将每隔一秒钟调用一次alarm_handler函数,注意这里将delay.it_interval.tv_sec设置为了1,当it_value中的值减到零时,将产生一个信号,并将it_value的值设置为it_interval,然后又重新开始记时。