2012-02-23 3592 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,并像秒表一样增加秒数。

相关问题