2022年3月12日 星期六

Linux clock_gettime()

int clock_gettime(clockid_t clk_id, struct timespec *tp);

系統呼叫 clock_gettime() 取得特定時鐘 (clk_id) 的時間,回傳秒數及 nsec,實際解析度可透過 clock_getres() 查詢。另外 clock_settime() 也可以設定特定時鐘,但有權限限制,並且不是每個時鐘都可以設定。

clk_id 可能這些,定義在 <unistd.h> 的 _POSIX_TIMERS 可知支援哪些:

  • CLOCK_REALTIME:也就是 wall clock,用 Epoch 開始的時間,所有實作皆支援。CLOCK_REALTIME 隨著時間線性穩定增加,節奏受到 adjtime() 和 NTP 節制。此外,可能會手動調整而有突然的跳躍,此部份不影響 nanosleep() 等相對時間計時的到期。
  • CLOCK_REALTIME_COARSE (Linux 2.6.32+):較快但較不精確版本的 CLOCK_REALTIME。
  • CLOCK_MONOTONIC: monotonic 意思是只能隨著時間線性穩定增加,是無法設定的或手動調整的。在 Linux 是開機啟算的時間,也就是 uptime。不計 suspend 的時間。
  • CLOCK_MONOTONIC_COARSE (Linux 2.6.32+):較快但較不精確版本的 CLOCK_MONOTONIC。
  • CLOCK_MONOTONIC_RAW (Linux 2.6.28+):類似 CLOCK_MONOTONIC,但是是取得硬體版本的時間,計數節奏不受軟體規範。不計 suspend 的時間。
  • CLOCK_BOOTTIME (Linux 2.6.39+):和 CLOCK_MONOTONIC 一樣,但包括 suspend 時間。
  • CLOCK_PROCESS_CPUTIME_ID (Linux 2.6.12+):計數單一 process 的 CPU 使用時間,包括旗下所有 thread。
  • CLOCK_THREAD_CPUTIME_ID (Linux 2.6.12+):計數單一 thread 的 CPU 使用時間。

參考

  1. man clock_gettime
  • https://lirobo.blogspot.com/2014/12/linux-time.html
  • 有些處理器架構,clock_gettime() 的實作由 vdso(7) 提供。
  • date(1), gettimeofday(2), settimeofday(2), time(2), adjtime(3), clock_getcpuclockid(3), ctime(3), ftime(3), pthread_getcpuclockid(3), sysconf(3), time(7), vdso(7), hwclock(8)

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...