GETITIMER - Linux手册页
Linux程序员手册 第2部分
更新日期: 2020-04-11
名称
getitimer,setitimer-获取或设置间隔计时器的值
语法
#include <sys/time.h> int getitimer(int which, struct itimerval *curr_value); int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
说明
这些系统调用提供对间隔计时器的访问,也就是说,这些计时器最初在将来的某个时间点到期,并且(可选)在此之后的定期间隔内到期。当计时器到期时,将为调用过程生成信号,并将计时器重置为指定的时间间隔(如果该时间间隔为非零)。
提供了三种类型的计时器-通过which参数指定-,每种计时器根据不同的时钟计数,并在计时器到期时生成不同的信号:
- ITIMER_REAL
- 该计时器以实际(即挂钟)时间倒计时。每次到期时,都会生成SIGALRM信号。
- ITIMER_VIRTUAL
- 该计时器根据进程消耗的用户模式CPU时间进行倒计时。 (该度量包括进程中所有线程消耗的CPU时间。)在每次到期时,都会生成SIGVTALRM信号。
- ITIMER_PROF
- 该计时器根据进程消耗的总CPU时间(即用户和系统)进行倒计时。 (该度量包括进程中所有线程消耗的CPU时间。)在每次到期时,都会生成SIGPROF信号。
- 结合ITIMER_VIRTUAL,此计时器可用于分析进程消耗的用户和系统CPU时间。
一个进程只有三种计时器中的一种。
计时器值由以下结构定义:
struct itimerval { struct timeval it_interval; /* Interval for periodic timer */ struct timeval it_value; /* Time until next expiration */ }; struct timeval { time_t tv_sec; /* seconds */ suseconds_t tv_usec; /* microseconds */ };
getitimer()
函数getitimer()将指定的计时器的当前值放置在curr_value所指向的缓冲区中。
在it_value子结构中填充直到指定计时器的下一次到期为止的剩余时间量。该值随着计时器的倒计时而变化,并且在计时器到期时将重置为it_interval。如果it_value的两个字段均为零,则此计时器当前处于撤防状态(无效)。
it_interval子结构填充有计时器间隔。如果it_interval的两个字段都为零,则这是单次计时器(即,它仅过期一次)。
setitimer()
函数setitimer()可以通过将计时器设置为new_value指定的值来对指定的计时器进行布防或撤防。如果old_value为非NULL,则它指向的缓冲区将用于返回计时器的先前值(即与getitimer()返回的信息相同)。
如果new_value.it_value中的任何一个字段都不为零,则计时器将在指定的时间开始失效。如果new_value.it_value中的两个字段均为零,则将撤防计时器。
new_value.it_interval字段指定计时器的新间隔。如果其两个子字段均为零,则计时器为单触发。
返回值
成功时,返回零。如果出错,则返回-1,并正确设置errno。
错误说明
- EFAULT
- new_value,old_value或curr_value无效的指针。
- EINVAL
- 它不是ITIMER_REAL,ITIMER_VIRTUAL或ITIMER_PROF之一;或(自Linux 2.6.22起)new_value指向的结构中的tv_usec字段之一包含的值在0到999999范围之外。
遵循规范
POSIX.1-2001,SVr4、4.4BSD(此调用首次出现在4.2BSD中)。 POSIX.1-2008标记getitimer()和setitimer()已过时,建议改为使用POSIX计时器API(timer_gettime(2),timer_settime(2)等)。
备注
计时器永远不会在请求的时间之前过期,但是可能会在之后的(短暂)时间过期,这取决于系统计时器的分辨率和系统负载。参见time(7)。 (但是请参见下面的"错误"。)如果在进程处于活动状态时计时器到期(对于ITIMER_VIRTUAL始终为true),则信号将在生成时立即传递。
通过fork(2)创建的子代不会继承其父代的间隔计时器。间隔计时器在execve(2)中保留。
POSIX.1保留了setitimer()与三个接口alarm(2),sleep(3)和usleep(3)之间的交互作用未指定。
这些标准没有说明通话的含义:
setitimer(,NULL,&old_value);
许多系统(Solaris,BSD以及其他系统)将其等同于:
getitimer(which,&old_value);
在Linux中,这被视为等效于new_value字段为零的调用。即,定时器被禁用。不要使用这种Linux错误功能:它是不可移植且不必要的。
BUGS
信号的生成和传递是不同的,并且上面列出的每个信号中只有一个实例可能正在等待处理。在非常重的负载下,ITIMER_REAL计时器可能会在传递来自先前到期的信号之前到期。在这种情况下,第二个信号将丢失。
在2.6.16之前的Linux内核上,计时器值以jiffies表示。如果发出请求,则将其计时器的jiffies表示值超过MAX_SEC_IN_JIFFIES(在include / linux / jiffies.h中定义),设置一个计时器,然后该计时器将被静默截断为该上限值。在Linux / i386上(从Linux 2.6.13开始,默认设置为0.004秒),这意味着计时器的上限约为99.42天。从Linux 2.6.16开始,内核多次使用不同的内部表示形式,并且此上限已删除。
在某些系统(包括i386)上,2.6.12之前的Linux内核存在一个错误,在某些情况下,该错误将使定时器过早过期(最多1次)。此错误已在内核2.6.12中修复。
POSIX.1-2001说,如果指定的tv_usec值在0到999999范围之外,则setitimer()应该会失败。但是,在2.6.21(含)以下的内核中,Linux不会给出错误,而是以静默方式发出调整计时器的相应秒值。从内核2.6.22开始,此不符合项已得到修复:tv_usec值不正确会导致EINVAL错误。
另外参见
gettimeofday(2),sigaction(2),signal(2),timer_create(2),timerfd_create(2),time(7)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。