版权所有 © 2014 tutorialspoint
#include <sys/time.h> int getitimer(int which, struct itimerval *value); int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
int getitimer(int which, struct itimerval *value); int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
struct itimerval { struct timeval it_interval; /* next value */ struct timeval it_value; /* current value */ }; struct timeval { long tv_sec; /* seconds */ long tv_usec; /* microseconds */ };
函数getitimer() 使用value指示的结构填充which(ITIMER_REAL、ITIMER_VIRTUAL或ITIMER_PROF之一)指示的计时器的当前设置。元素it_value设置为计时器上剩余的时间量,如果计时器已禁用,则为零。类似地,it_interval设置为重置值。函数setitimer() 将指示的计时器设置为value中的值。如果ovalue非零,则将计时器的旧值存储在那里。
计时器从it_value递减到零,生成信号,然后重置为it_interval。设置为零(it_value为零或计时器超时且it_interval为零)的计时器将停止。
tv_sec和tv_usec在确定计时器的持续时间方面都很重要。
计时器永远不会在请求时间之前超时,但可能会在之后一段时间(很短)超时,这取决于系统计时器分辨率和系统负载。(但请参见下面的错误。)超时时,将生成信号并重置计时器。如果计时器在进程活动时超时(对于ITIMER_VIRTUAL始终为真),则将在生成时立即传递信号。否则,传递将被偏移一小段时间,这取决于系统负载。
gettimeofday (2)
sigaction (2)
signal (2)
在Linux上,计时器值以节拍表示。如果请求设置一个计时器,其节拍表示的值超过MAX_SEC_IN_JIFFIES(在include/linux/jiffies.h中定义),则计时器将静默截断到此上限值。在Linux/x86(自内核2.6.13以来,默认节拍为0.004秒)上,这意味着计时器的上限值约为99.42天。
在某些系统(包括x86)上,2.6.12版本之前的Linux内核存在一个错误,在某些情况下会产生最多一个节拍的提前计时器超时。此错误已在内核2.6.12中修复。
POSIX.1-2001指出,如果指定的tv_usec值不在0到999999范围内,则setitimer()应该失败。但是,Linux不会报错,而是会静默调整计时器的相应秒值。将来(计划于2007年3月),这种不符合标准的情况将得到修复:现有应用程序现在应该进行修复,以确保它们提供正确格式的tv_usec值。
广告