在多線程的應用中要用到延時函數,開始時我只用到 sleep 這個秒級函數,但在 solaris 上跑時,程序運行到sleep時,卻顯示 “Alarm clock” 這句話後就中止了。據說是產生了 alarm 這個信號,而系統默認信號處理就是中止程序,所以要在程序中把這個設置為忽略:
signal(SIGALRM, SIG_IGN);
Unix 上的延時函數有好幾種:
一、 基礎知識
1、時間類型。Linux下常用的時間類型有4個:time_t,struct timeval,struct timespec,struct tm。
(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 */
- };
2、 時間操作
(1) 時間格式間的轉換函數
主要是 time_t、struct tm、時間的字符串格式之間的轉換。看下面的函數參數類型以及返回值類型:
- 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的參數以及返回值類型相同,區別是前者返回的格林威治標准時間,後者是當地時間。
(2) 獲取時間函數
兩個函數,獲取的時間類型看原型就知道了:
- time_t time(time_t *t);
- int gettimeofday(struct timeval *tv, struct timezone *tz);
前者獲取time_t類型,後者獲取struct timeval類型,因為類型的緣故,前者只能精確到秒,後者可以精確到微秒。