最近踩坑了,全都拜localtime所赐,因为localtime居然不可重入:
- ubuntu@VM-0-15-ubuntu:~$ man localtime
- CTIME(3) Linux Programmer's Manual CTIME(3)
- NAME
- asctime, ctime, gmtime, localtime, mktime, asctime_r, ctime_r, gmtime_r, localtime_r - transform date and time to broken-
- down time or ASCII
- SYNOPSIS
- #include <time.h>
- char *asctime(const struct tm *tm);
- char *asctime_r(const struct tm *tm, char *buf);
-
- char *ctime(const time_t *timep);
- char *ctime_r(const time_t *timep, char *buf);
-
- struct tm *gmtime(const time_t *timep);
- struct tm *gmtime_r(const time_t *timep, struct tm *result);
-
- struct tm *localtime(const time_t *timep);
- struct tm *localtime_r(const time_t *timep, struct tm *result);
-
- time_t mktime(struct tm *tm);
-
- Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
- asctime_r(), ctime_r(), gmtime_r(), localtime_r():
- _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _BSD_SOURCE || _SVID_SOURCE || _POSIX_SOURCE
- DESCRIPTION
- The ctime(), gmtime() and localtime() functions all take an argument of data type time_t, which represents calendar time.
- When interpreted as an absolute time value, it represents the number of seconds elapsed since the Epoch, 1970-01-01
- 00:00:00 +0000 (UTC).
- The asctime() and mktime() functions both take an argument representing broken-down time, which is a representation sepa[m
- rated into year, month, day, and so on.
- Broken-down time is stored in the structure tm, which is defined in <time.h> as follows:
- struct tm {
- int tm_sec; /* Seconds (0-60) */
- int tm_min; /* Minutes (0-59) */
- int tm_hour; /* Hours (0-23) */
- int tm_mday; /* Day of the month (1-31) */
- int tm_mon; /* Month (0-11) */
- int tm_year; /* Year - 1900 */
- int tm_wday; /* Day of the week (0-6, Sunday = 0) */
- int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */
- int tm_isdst; /* Daylight saving time */
- };
真的需要小心一点。