一,、時(shí)間類(lèi)型。
Linux下常用的時(shí)間類(lèi)型有4個(gè):time_t,,struct timeval,,struct timespec,struct tm,。 (1)time_t是一個(gè)長(zhǎng)整型,,一般用來(lái)表示用1970年以來(lái)的秒數(shù)。 (2)Struct timeval有兩個(gè)成員,,一個(gè)是秒,,一個(gè)是微妙。
struct timeval
{ long tv_sec; /**//* seconds */ long tv_usec; /**//* microseconds */ }; (3)struct timespec有兩個(gè)成員,,一個(gè)是秒,,一個(gè)是納秒。
struct timespec
{ time_t tv_sec; /**//* seconds */ long tv_nsec; /**//* nanoseconds */ }; (4)struct tm是直觀(guān)意義上的時(shí)間表示方法:
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 */ }; 二,、 時(shí)間操作 (1) 時(shí)間格式間的轉(zhuǎn)換函數(shù) 主要是 time_t,、struct tm、時(shí)間的字符串格式之間的轉(zhuǎn)換,??聪旅娴暮瘮?shù)參數(shù)類(lèi)型以及返回值類(lèi)型:
char *asctime(const struct tm *tm); char *ctime(const time_t *timep); struct tm *gmtime(const time_t *timep); struct tm *localtime(const time_t *timep); time_t mktime(struct tm *tm); gmtime和localtime的參數(shù)以及返回值類(lèi)型相同,區(qū)別是前者返回的格林威治標(biāo)準(zhǔn)時(shí)間,,后者是當(dāng)?shù)貢r(shí)間,。 (2) 獲取時(shí)間函數(shù) 兩個(gè)函數(shù),獲取的時(shí)間類(lèi)型看原型就知道了:
time_t time(time_t *t); int gettimeofday(struct timeval *tv, struct timezone *tz); 前者獲取time_t類(lèi)型,,后者獲取struct timeval類(lèi)型,,因?yàn)轭?lèi)型的緣故,前者只能精確到秒,,后者可以精確到微秒,。 三、 延時(shí)函數(shù) 主要的延遲函數(shù)有:sleep(),usleep(),nanosleep(),select(),pselect().
unsigned int sleep(unsigned int seconds); void usleep(unsigned long usec); int nanosleep(const struct timespec *req, struct timespec *rem); int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,struct timeval *timeout); int pselect(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout, const sigset_t *sigmask);
alarm函數(shù)是信號(hào)方式的延遲,,這種方式不直觀(guān),,這里不說(shuō)了。 僅通過(guò)函數(shù)原型中時(shí)間參數(shù)類(lèi)型,,可以猜測(cè)sleep可以精確到秒級(jí),,usleep/select可以精確到微妙級(jí),nanosleep和pselect可以精確到納秒級(jí),。 而實(shí)際實(shí)現(xiàn)中,,linux上的nanosleep和alarm相同,都是基于內(nèi)核時(shí)鐘機(jī)制實(shí)現(xiàn),,受linux內(nèi)核時(shí)鐘實(shí)現(xiàn)的影響,,并不能達(dá)到納秒級(jí)的精度,man nanosleep也可以看到這個(gè)說(shuō)明,,man里給出的精度是:Linux/i386上是10 ms ,,Linux/Alpha上是1ms。 這里有一篇文章http://blog.csdn.net/zhoujunyi/archive/2007/03/30/1546330.aspx,,測(cè)試了不同延遲函數(shù)之間的精確度,。文章給出的結(jié)論是linux上精度最高的是select,,10ms級(jí)別。我在本機(jī)器測(cè)試select和pselect相當(dāng),,都達(dá)到了1ms級(jí)的精度,,精度高于文章中給出的10ms,sleep在秒級(jí)以上和usleep/nanosleep相當(dāng),。下面貼下我機(jī)器上1ms時(shí)候的測(cè)試結(jié)果,,其他不貼了:
sleep 1000 0 -1000 usleep 1000 2974 1974 nanosleep 1000 2990 1990 select 1000 991 -9 pselect 1000 990 -10 gettimeofday 1000 1000 0 而使用gettimeofday循環(huán)不停檢測(cè)時(shí)間,可精確微秒級(jí),,不過(guò)不適宜用來(lái)做定時(shí)器模塊,。 因此后面的定時(shí)器模塊將選擇select為延遲函數(shù)。
|