1. 程式人生 > >linux時間和定時器zz

linux時間和定時器zz

一段時間 納秒 target 程序 set 不能 ive thread 微秒

https://www.cnblogs.com/cobbliu/p/3627061.html

Linux 的計時函數,用於獲得當前時間:

  • time(2) / time_t (秒)
  • ftime(3) / struct timeb (毫秒)
  • gettimeofday(2) / struct timeval (微秒)
  • clock_gettime(2) / struct timespec (納秒)
  • gmtime / localtime / timegm / mktime / strftime / struct tm (這些與當前時間無關)

定時函數,用於讓程序等待一段時間或安排計劃任務:

  • sleep
  • alarm
  • getitimer / setitimer
  • timer_create / timer_settime / timer_gettime / timer_delete
  • timerfd_create / timerfd_gettime / timerfd_settime
  • 條件變量pthread_cond_timedwait實現
  • IO多路復用select, epoll實現

一般情況下,獲取當前時間常用gettimerofday,因為它的精度是1us,並且在x86平臺上它是用戶態實現的,沒有系統調用和上下文切換的開銷。

定時函數中:

  1. sleep / alarm在實現時有可能用了信號 SIGALRM,在多線程程序中處理信號是個相當麻煩的事情,應當盡量避免。
  2. nanosleep 和 clock_nanosleep 是線程安全的,但是在非阻塞網絡編程中,絕對不能用讓線程掛起的方式來等待一段時間,程序會失去響應。正確的做法是註冊一個時間回調函數。
  3. getitimer 和 timer_create 也是用信號來 deliver 超時,在多線程程序中也會有麻煩。timer_create 可以指定信號的接收方是進程還是線程,算是一個進步,不過在信號處理函數(signal handler)能做的事情實在很受限。
  4. timerfd_create 把時間變成了一個文件描述符,該“文件”在定時器超時的那一刻變得可讀,這樣就能很方便地融入到 select/poll 框架中,用統一的方式來處理 IO 事件和超時事件。
  5. 利用select, epoll的timeout實現定時功能,它們的缺點是定時精度只有毫秒,遠低於 timerfd_settime 的定時精度。

linux時間和定時器zz