久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Unix C 延時(shí)函數(shù)小結(jié)

 haliiz 2010-04-23
在多線程的應(yīng)用中要用到延時(shí)函數(shù),,開始時(shí)我只用到 sleep 這個(gè)秒級(jí)函數(shù),,但在 solaris  上跑時(shí),,程序運(yùn)行到sleep時(shí),卻顯示 “Alarm clock” 這句話后就中止了。據(jù)說是產(chǎn)生了 alarm 這個(gè)信號(hào),,而系統(tǒng)默認(rèn)信號(hào)處理就是中止程序,所以要在程序中把這個(gè)設(shè)置為忽略:
C代碼 復(fù)制代碼
  1. signal(SIGALRM, SIG_IGN);  


unix 上的延時(shí)函數(shù)有好幾種:
引用

一、 基礎(chǔ)知識(shí)
1,、時(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è)是微妙。
C代碼 復(fù)制代碼
  1. struct timeval {   
  2.    long tv_sec;        /**//* seconds */  
  3.    long tv_usec;  /**//* microseconds */  
  4. ;  

(3)struct timespec有兩個(gè)成員,一個(gè)是秒,,一個(gè)是納秒,。
C代碼 復(fù)制代碼
  1. struct timespec{   
  2.     time_t  tv_sec;         /**//* seconds */  
  3.     long    tv_nsec;        /**//* nanoseconds */  
  4. };  

(4)struct tm是直觀意義上的時(shí)間表示方法:
C代碼 復(fù)制代碼
  1. struct tm {   
  2.     int     tm_sec;         /**//* seconds */  
  3.     int     tm_min;         /**//* minutes */  
  4.     int     tm_hour;        /**//* hours */  
  5.     int     tm_mday;        /**//* day of the month */  
  6.     int     tm_mon;         /**//* month */  
  7.     int     tm_year;        /**//* year */  
  8.     int     tm_wday;        /**//* day of the week */  
  9.     int     tm_yday;        /**//* day in the year */  
  10.     int     tm_isdst;       /**//* daylight saving time */  
  11. };  

2、 時(shí)間操作
(1) 時(shí)間格式間的轉(zhuǎn)換函數(shù)
主要是 time_t,、struct tm,、時(shí)間的字符串格式之間的轉(zhuǎn)換??聪旅娴暮瘮?shù)參數(shù)類型以及返回值類型:
C代碼 復(fù)制代碼
  1. char *asctime(const struct tm *tm);   
  2. char *ctime(const time_t *timep);   
  3. struct tm *gmtime(const time_t *timep);   
  4. struct tm *localtime(const time_t *timep);   
  5. 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í)間類型看原型就知道了:
C代碼 復(fù)制代碼
  1. time_t time(time_t *t);   
  2. int gettimeofday(struct timeval *tv, struct timezone *tz);  

前者獲取time_t類型,后者獲取struct timeval類型,,因?yàn)轭愋偷木壒?,前者只能精確到秒,后者可以精確到微秒,。


二,、 延遲函數(shù)
主要的延遲函數(shù)有:sleep(),usleep(),nanosleep(),select(),pselect().
C代碼 復(fù)制代碼
  1. unsigned int sleep(unsigned int seconds);   
  2.   
  3. void usleep(unsigned long usec);   
  4.   
  5. int nanosleep(const struct timespec *req, struct timespec *rem);   
  6.   
  7. int select(int n, fd_set *readfds,fd_set *writefds,fd_set *exceptfds,   
  8. struct timeval *timeout);   
  9.   
  10. int pselect(int n,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,   
  11.  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é)果,,其他不貼了:
C代碼 復(fù)制代碼
  1. sleep           1000          0      -1000    
  2. usleep           1000       2974       1974    
  3. nanosleep        1000       2990       1990    
  4. select           1000        991         -9    
  5. pselect           1000        990        -10    
  6. gettimeofday           1000       1000          0  

而使用gettimeofday循環(huán)不停檢測(cè)時(shí)間,,可精確微秒級(jí),不過不適宜用來做定時(shí)器模塊,。
因此后面的定時(shí)期模塊將選擇select為延遲函數(shù),。


本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/wbj1234566/archive/2008/05/13/2442264.aspx


我在用 usleep 時(shí)卻發(fā)現(xiàn)有部分線程完全在等待中,,沒有醒過來, 最后換用了 nanosleep
正?;亓恕W⒁?要調(diào)用 nanosleep, 編譯時(shí)要帶 -lposix4
nanosleep 的例子(來自http://hi.baidu.com/zengzhaonong/blog/item/2fa4a799e282bb096f068c62.html)
C代碼 復(fù)制代碼
  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. #include <unistd.h>   
  4. #include <sys/time.h>   
  5. #include <sched.h>   
  6. #define COUNT 1000   
  7. #define MILLION 1000000L   
  8.   
  9. int main(void)   
  10. {   
  11.     int i;   
  12.     struct timespec slptm;   
  13.     long   tdif;   
  14.     struct timeval tend, tstart;   
  15.   
  16.     slptm.tv_sec = 0;   
  17.     slptm.tv_nsec = 1000;      //1000 ns = 1 us   
  18.   
  19.     //struct sched_param param;       
  20.     //param.sched_priority = 0;   
  21.     //sched_setscheduler(getpid(), SCHED_FIFO, &param);   
  22.   
  23.     if (gettimeofday(&tstart, NULL) == -1) {   
  24.         fprintf(stderr, "Failed to get start time\n");   
  25.         return 1;   
  26.     }   
  27.     for (i = 0; i < COUNT; i++) {   
  28.         if (nanosleep(&slptm, NULL) == -1) {   
  29.             perror("Failed to nanosleep");   
  30.             return 1;   
  31.         }   
  32.     }   
  33.     if (gettimeofday(&tend, NULL) == -1) {   
  34.         fprintf(stderr, "Failed to get end time\n");   
  35.         return 1;   
  36.     }   
  37.     tdif = MILLION * (tend.tv_sec - tstart.tv_sec) + (tend.tv_usec - tstart.tv_usec);   
  38.     printf("nanosleep() time is %ld us\n", tdif/COUNT);   
  39.     return 0;   
  40. }   
  41.   
  42.   
  43.   
  44. HZ                                 250HZ   
  45. 時(shí)鐘中斷的時(shí)間間隔:                   4 ms   (1000ms/250)   
  46. ----------------------------------------   
  47. nanosleep() time is 4019 us        (4.019 ms)   
  48. 說明nanosleep的睡眠定時(shí)器依賴于時(shí)鐘中斷   
  49.   
  50.   
  51.   
  52. HZ                                 1000HZ   
  53. 時(shí)鐘中斷的時(shí)間間隔:                   1 ms   
  54. ----------------------------------------   
  55. nanosleep() time is 12 us   
  56. 注: 最小睡眠時(shí)間為1 us  

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多