2009-11-30 32 views
2

我想知道發生兩個事件之間已經過去的時間。現在處理系統時間變化

,簡單的方法是使用類似:

time_t x, y; 
x = time(NULL); 

/* Some other stuff happens */ 

y = time(NULL); 
printf("Time passed: %i", y-x); 

然而,有可能是系統時間在這兩個事件之間改變。

是否有另一種方法來了解兩個事件之間已經過去的時間?或者有沒有辦法檢測系統時間的變化?

回答

5

既然你在Linux上是很明顯,你可以使用POSIX CLOCK_MONOTONIC時鐘得到一個計時器,是系統時間更改的影響:

struct timespec ts1, ts2; 

clock_gettime(CLOCK_MONOTONIC, &ts1); 
/* Things happen */ 
clock_gettime(CLOCK_MONOTONIC, &ts2); 

ts2.tv_sec -= ts1.tv_sec; 
ts2.tv_nsec -= ts1.tv_nsec; 
if (ts2.tv_nsec < 0) 
{ 
    ts2.tv_nsec += 1000000000L; 
    ts2.tv_sec -= 1; 
} 

printf("Elapsed time: %lld.%09lds\n", (long long)ts2.tv_sec, ts2.tv_nsec); 

要檢查系統支持CLOCK_MONOTONIC,檢查sysconf(_SC_MONOTONIC_CLOCK) > 0

1

您可以在Linux上使用clock_gettime()或在其他一些Unix系統上使用gethrtime()。雖然兩個這樣的值之間的差異會給你一個時間間隔,但這些調用並不會給你定期的時間值。正如HP-UX關於gethrtime()所述:

gethrtime()函數返回當前的高分辨率實時。時間以過去一定時間以來的納秒錶示。

+0

如果使用clock_gettime(),則需要指定CLOCK_MONOTONIC - 如果支持。如果系統時鐘改變,使用正常選項CLOCK_REALTIME將導致不準確。 – Dipstick