2012-02-23 3598 views
7

手冊頁getitimer(2)聲稱,爲什麼tv_sec和tv_usec在確定定時器的持續時間方面有重要意義?

都tv_sec和確定定時器

的 時間tv_usec顯著它不會去說這是爲什麼。在我遇到tv_sec的許多例子中,我們將其設置爲0,而tv_usec則給出了一些合理的值,反之亦然。這些定時器是同時倒計時,還是總倒計時間tv_sec + tv_usec?我應該同時使用嗎?都不是?

+2

我不相信該手冊頁包括「爲什麼......」 – 2012-02-23 05:17:47

+0

你是一個聰明的傢伙! – Ziggy 2012-02-23 05:19:27

回答

17

man page記錄了timeval結構:

struct timeval { 
    long tv_sec;    /* seconds */ 
    long tv_usec;    /* microseconds */ 
}; 

如果你想等待幾秒鐘,你只需設置tv_sec。如果你想等一秒鐘,你會設置tv_usec。如果你想等待4.5秒,你會設置這兩個到適當的值(分別爲4和500000)

+2

另外,是usec不允許超過1秒? – Ziggy 2012-02-23 05:30:57

+2

POSIX似乎沒有爲所有角落情況指定任何行爲(tv_usec <0,tv_nsec <0,tv_usec> 1000000,tv_nsec> 1000000000),所以最好不要發生這種情況。 – 2012-02-23 05:38:13

1

是的,總時間是兩者的總和。 tv_sec是秒。而tv_usec超出了那個微秒。

+0

所以例如,如果我給他們的值分別爲1和250000,這將是1.25秒? – Ziggy 2012-02-23 05:19:11

+0

是的。這將是1.25 – 2012-02-23 05:20:04

3

的結構雖然描述:

struct timeval { 
    long tv_sec;    /* seconds */ 
    long tv_usec;    /* microseconds */ 
}; 

正如你看到的,總的時間爲tv_sec + (1.0/1000000) * tv_usec秒。這就是爲什麼當你需要設置tv_usec第二下時,當你需要的時間超過1秒同時設置了(但通常最終只tv_sec設置)

+0

我編輯的答案已經包括1/100萬而不是 – 2012-02-23 05:22:25

-1

我有內存泄漏,因爲我沒有設置tv_usec。 Comuter獲得這兩個值的總和,如果你沒有初始化其中的一個值,那麼總和值可能是隨機的。

0

long int tv_usec這是剩餘時間( 秒的一小部分),表示爲微秒數。它總是比一百萬更少的 。

tv_sec將處理整秒,而tv_usec處理微秒。

微秒將達到其最大值(100萬)時重置爲0,並像秒錶一樣增加秒數。

相關問題