一、時(shí)間類型。
Linux下常用的時(shí)間類型有4個(gè):time_t,struct timeval,struct timespec,struct tm。 (1)time_t是一個(gè)長(zhǎng)整型,一般用來表示用1970年以來的秒數(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是直觀意義上的時(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ù)類型以及返回值類型:
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ù)以及返回值類型相同,區(qū)別是前者返回的格林威治標(biāo)準(zhǔn)時(shí)間,后者是當(dāng)?shù)貢r(shí)間。 (2) 獲取時(shí)間函數(shù) 兩個(gè)函數(shù),獲取的時(shí)間類型看原型就知道了:
time_t time(time_t *t); int gettimeofday(struct timeval *tv, struct timezone *tz); 前者獲取time_t類型,后者獲取struct timeval類型,因?yàn)轭愋偷木壒剩?/font>前者只能精確到秒,后者可以精確到微秒。 三、 延時(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)方式的延遲,這種方式不直觀,這里不說了。 僅通過函數(shù)原型中時(shí)間參數(shù)類型,可以猜測(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è)說明,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í),不過不適宜用來做定時(shí)器模塊。 因此后面的定時(shí)器模塊將選擇select為延遲函數(shù)。
|