快速业务通道

Linux系统进程间隔定时器Itimer

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-24
参数p通过强制类型转换解释为进程的task_struct结构类型的指针.

  (2)向进程发送SIGALRM信号.

  (3)在进程的it_real_incr非0的情况下继续启动real_timer定时器.,计算real_timer定时器的expires值为(jiffies+it_real_incr).然后,调用add_timer()函数将real_timer加入到内核动态定时器链表中.

  7.7.3 itimer定时器的系统调用

  与itimer定时器相关的syscall有两个:getitimer()和setitimer().其中,getitimer()用于查询调用进程的三个间隔定时器的信息,而setitimer()则用来设置调用进程的三个间隔定时器.这两个syscall都是现在kernel/itimer.c文件中.

  7.7.3.1 getitimer()系统调用的实现

  函数sys_getitimer()有两个参数:(1)which,指定查询调用进程的哪一个间隔定时器,其取值可以是ITIMER_REAL、ITIMER_VIRT和ITIMER_PROF三者之一.(2)value指针,指向用户空间中的一个itimerval结构,用于接收查询结果.该函数的源码如下:

  /* SMP: Only we modify our itimer values. */

  asmlinkage long sys_getitimer(int which, struct itimerval *value)

  {

  int error = -EFAULT;

  struct itimerval get_buffer;

  if (value) {

  error = do_getitimer(which, &get_buffer);

  if (!error &&

  copy_to_user(value, &get_buffer, sizeof(get_buffer)))

  error = -EFAULT;

  }

  return error;

  }

  显然,sys_getitimer()函数主要通过do_getitimer()函数来查询当前进程的间隔定时器信息,并将查询结果保存在内核空间的结构变量get_buffer中.然后,调用copy_to_usr()宏将get_buffer中结果拷贝到用户空间缓冲区中.

  函数do_getitimer()的源码如下(kernel/itimer.c):

  int do_getitimer(int which, struct itimerval *value)

  {

  register unsigned long val, interval;

  switch (which) {

  case ITIMER_REAL:

  interval = current->it_real_incr;

  val = 0;

  /*

  * FIXME! This needs to be atomic, in case the kernel timer happens!

  */

  if (timer_pending(¤t->real_timer)) {

  val = current->real_timer.expires - jiffies;

  /* look out for negative/zero itimer.. */

  if ((long) val <= 0)

  val = 1;

  }

  break;

  case ITIMER_VIRTUAL:

  val = current->it_virt_value;

  interval = current->it_virt_incr;

  break;

  case ITIMER_PROF:

  val = current->it_prof_value;

  interval = current->it_prof_incr;

  break;

  default:

  return(-EINVAL);

  }

  jiffiestotv(val, &value->it_value);

  jiffiestotv(interval, &value->it_interval);

  return 0;

  }

  查询的过程如下:

  (1),用局部变量val和interval分别表示待查询间隔定时器的间隔计数器的当前值和初始值.

  (2)如果which=ITIMER_REAL,则查询当前进程的ITIMER_REAL间隔定时器.于是从 current->it_real_incr中得到ITIMER_REAL间隔定时器的间隔计数器的初始值,并将其保存到interval局部变量中.而对于间隔计数器的当前值,ITITMER_REAL间隔定时器是通过real_timer这个内核动态定时器来实现的,因此不能通过 current->it_real_value来获得ITIMER_REAL间隔定时器的间隔计数器的当前值,而通过real_timer来得到这个值.为此先用timer_pending()函数来判断current->real_timer是否已被起动.如果未启动,则说明 ITIMER_REAL间隔定时器也未启动,因此其间隔计数器的

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号