getitimer() - Unix,Linux系统调用 - 技术教程
Tutorials Point


  Unix初学者教程
  Unix Shell编程
  高级Unix
  Unix有用参考
  Unix有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考资料     讨论区     关于TP  

getitimer() - Unix,Linux系统调用


previous next AddThis Social Bookmark Button

广告

名称

getitimer, setitimer - 获取或设置间隔计时器的值

概要

#include <sys/time.h> 

int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);

描述

系统为每个进程提供三个间隔计时器,每个计时器在不同的时间域中递减。当任何计时器到期时,都会向进程发送信号,并且计时器(可能)会重新启动。
标签描述
ITIMER_REAL 以实时递减,到期时发送SIGALRM信号。
ITIMER_VIRTUAL 仅在进程执行时递减,到期时发送SIGVTALRM信号。
ITIMER_PROF 在进程执行和系统代表进程执行时都递减。与ITIMER_VIRTUAL结合使用时,此计时器通常用于分析应用程序在用户空间和内核空间中花费的时间。到期时发送SIGPROF信号。
计时器值由以下结构定义

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指示的结构填充由whichITIMER_REALITIMER_VIRTUALITIMER_PROF之一)指示的计时器的当前设置。元素it_value设置为计时器上剩余的时间量,如果计时器已禁用,则为零。类似地,it_interval设置为重置值。函数setitimer() 将指示的计时器设置为value中的值。如果ovalue非零,则旧的计时器值将存储在那里。

计时器从it_value递减到零,生成信号,然后重置为it_interval。设置为零的计时器(it_value为零或计时器到期且it_interval为零)将停止。

tv_sectv_usec在确定计时器的持续时间方面都很重要。

计时器永远不会在请求时间之前到期,但可能会在之后的一段时间(很短)到期,这取决于系统计时器分辨率和系统负载。(但请参见下面的错误。)到期时,将生成信号并重置计时器。如果计时器在进程活动时到期(对于ITIMER_VIRTUAL始终为真),则在生成时会立即传递信号。否则,传递将被延迟一小段时间,这取决于系统负载。

返回值

成功时,返回零。出错时,返回-1,并相应设置errno

错误

标签描述
EFAULT valueovalue不是有效的指针。
EINVAL which不是ITIMER_REALITIMER_VIRTUALITIMER_PROF之一。

备注

通过fork(2)创建的子进程不会继承其父进程的间隔计时器。间隔计时器在execve(2)中得以保留。

符合标准

POSIX.1-2001, SVr4, 4.4BSD(此调用首次出现在4.2BSD中)。

参见

信号的生成和传递是不同的,并且每个进程可能只有一个上述信号的实例处于挂起状态。在负载非常大的情况下,ITIMER_REAL计时器可能在先前到期信号传递之前到期。在这种情况下,第二个信号将丢失。

在Linux上,计时器值以jiffies表示。如果请求设置一个计时器,其jiffies表示超过MAX_SEC_IN_JIFFIES(在include/linux/jiffies.h中定义),则计时器将静默截断到此上限值。在Linux/x86上(自从内核2.6.13以来,默认的jiffy为0.004秒),这意味着计时器的上限值大约为99.42天。

在某些系统(包括x86)上,2.6.12版本之前的Linux内核存在一个错误,在某些情况下会提前最多一个jiffy导致计时器到期。此错误已在2.6.12内核中修复。

POSIX.1-2001指出,如果指定的tv_usec值超出0到999999的范围,则setitimer()应该失败。但是,Linux不会报错,而是会静默调整计时器的相应秒数值。将来(计划于2007年3月),这种不符合标准的情况将得到修复:现有的应用程序现在应该进行修复,以确保它们提供正确格式的tv_usec值。


previous next Printer Friendly

广告


  

广告



广告
© . All rights reserved.