C 定期linux计时器的计时器过期值表示什么?

C 定期linux计时器的计时器过期值表示什么?,c,linux,timer,C,Linux,Timer,我已经完成了手册页的创建,并启动了计时器 但是,我不确定struct itimerspec的字段“it_value”的使用是否与arm(开始)和disarm(停止)不同 问题:为该字段指定非零值时会发生什么情况。手册页记录了非零值将启动计时器并记录为计时器过期时间的文档?计时器过期意味着什么?计时器过期的影响是什么 要启动(arm)计时器,可以给出从1ns到等于计时器间隔(非零)的值。这两种情况的区别和预期行为是什么 方法1:使计时器过期时间等于间隔 int timerfd = timerfd

我已经完成了手册页的创建,并启动了计时器

但是,我不确定struct itimerspec的字段“it_value”的使用是否与arm(开始)和disarm(停止)不同

问题:为该字段指定非零值时会发生什么情况。手册页记录了非零值将启动计时器并记录为计时器过期时间的文档?计时器过期意味着什么?计时器过期的影响是什么

要启动(arm)计时器,可以给出从1ns到等于计时器间隔(非零)的值。这两种情况的区别和预期行为是什么

方法1:使计时器过期时间等于间隔

int timerfd = timerfd_create(CLOCK_MONOTONIC,0);
int milliseconds = 50;// 50 ms for example
struct itimerspec timspec;
timspec.it_interval.tv_sec = 0;
timspec.it_interval.tv_nsec = milliseconds * 1000000;
timspec.it_value.tv_sec = timspec.it_interval.tv_sec;
timspec.it_value.tv_nsec = timspec.it_interval.tv_nsec;
int res = timerfd_settime(timerfd, 0, &timspec, 0);
方法2:计时器到期时间小于计时器间隔

int timerfd = timerfd_create(CLOCK_MONOTONIC,0);
int milliseconds = 50;// 50 ms for example
struct itimerspec timspec;
timspec.it_interval.tv_sec = 0;
timspec.it_interval.tv_nsec = milliseconds * 1000000;
timspec.it_value.tv_sec = 0;
timspec.it_value.tv_nsec = 1;
int res = timerfd_settime(timerfd, 0, &timspec, 0);
但是,我不确定struct itimerspec的字段“it_value”的使用是否与arm(开始)和disarm(停止)不同

显然,您感兴趣的是将此字段与
timerfd\u settime()
的第二个参数一起使用,而不是解释由第三个参数指向或由
timerfd\u gettime()
填充的结构(如果有)中设置的值。不过,一切都差不多

你似乎把重点放在了错误的事情上,在设定和解除计时器上。正如你链接的主页所说

new_value
参数指定计时器的初始到期时间和间隔

(重点补充)。也就是说,
struct itimerspec
it\u值
表示下一个计时器到期之前的时间量(或该到期的绝对时间,取决于标志),但两个字段均为零表示计时器永远不会到期——它已解除警报——而不是它将立即到期。此成员传递的值与
it\u interval
成员传递的值没有任何特定的相关性

因此,
timerfd\u settime()
可用于防护已解除防护的计时器或解除防护的计时器,具体取决于传递给它的
It\u值,但这些是更一般行为的特殊结果。一般情况下,它用于更改计时器下次到期前的时间量以及后续到期之间的时间增量

要启动(arm)计时器,可以给出从1ns到等于计时器间隔(非零)的值

。。。或者更多。下次到期前的延迟不限于间隔的长度。作为一种极端情况,时间间隔可以为零,因此计时器在过期一次后解除

这两种情况的区别和预期行为是什么

方法1:使计时器过期时间等于[非零]间隔

计时器将首先在指定的时间量(等于间隔)后过期。每次到期时,它都将重置为间隔给定的时间

方法2:[非零]计时器到期时间小于[非零]计时器间隔

int timerfd = timerfd_create(CLOCK_MONOTONIC,0);
int milliseconds = 50;// 50 ms for example
struct itimerspec timspec;
timspec.it_interval.tv_sec = 0;
timspec.it_interval.tv_nsec = milliseconds * 1000000;
timspec.it_value.tv_sec = 0;
timspec.it_value.tv_nsec = 1;
int res = timerfd_settime(timerfd, 0, &timspec, 0);
计时器将首先在指定的时间量(小于间隔)后过期。每次到期时,它都将重置为间隔给定的时间

但是,我不确定struct itimerspec的字段“it_value”的使用是否与arm(开始)和disarm(停止)不同

显然,您感兴趣的是将此字段与
timerfd\u settime()
的第二个参数一起使用,而不是解释由第三个参数指向或由
timerfd\u gettime()
填充的结构(如果有)中设置的值。不过,一切都差不多

你似乎把重点放在了错误的事情上,在设定和解除计时器上。正如你链接的主页所说

new_value
参数指定计时器的初始到期时间和间隔

(重点补充)。也就是说,
struct itimerspec
it\u值
表示下一个计时器到期之前的时间量(或该到期的绝对时间,取决于标志),但两个字段均为零表示计时器永远不会到期——它已解除警报——而不是它将立即到期。此成员传递的值与
it\u interval
成员传递的值没有任何特定的相关性

因此,
timerfd\u settime()
可用于防护已解除防护的计时器或解除防护的计时器,具体取决于传递给它的
It\u值,但这些是更一般行为的特殊结果。一般情况下,它用于更改计时器下次到期前的时间量以及后续到期之间的时间增量

要启动(arm)计时器,可以给出从1ns到等于计时器间隔(非零)的值

。。。或者更多。下次到期前的延迟不限于间隔的长度。作为一种极端情况,时间间隔可以为零,因此计时器在过期一次后解除

这两种情况的区别和预期行为是什么

方法1:使计时器过期时间等于[非零]间隔

计时器将首先在指定的时间量(等于间隔)后过期。每次到期时,它都将重置为间隔给定的时间

方法2:[非零]计时器到期时间小于[非零]计时器间隔

int timerfd = timerfd_create(CLOCK_MONOTONIC,0);
int milliseconds = 50;// 50 ms for example
struct itimerspec timspec;
timspec.it_interval.tv_sec = 0;
timspec.it_interval.tv_nsec = milliseconds * 1000000;
timspec.it_value.tv_sec = 0;
timspec.it_value.tv_nsec = 1;
int res = timerfd_settime(timerfd, 0, &timspec, 0);

计时器将首先在指定的时间量(小于间隔)后过期。每次到期时,它将重置为间隔给定的时间。

我不理解“每次到期时,它将重置为间隔给定的时间”的语句。例如:在方法2中;失效时间=1ns,间隔=50ms;这是否意味着tim