快速业务通道

Linux系统进程间隔定时器Itimer

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-24
当前值肯定是0.因此将val变量简单地置0就可以了.如果已经启动,则间隔计数器的当前值应该等于(timer_real.expires-jiffies).

  (3)如果which=ITIMER_VIRT,则查询当前进程的ITIMER_VIRT间隔定时器.于是简单地将计数器初值it_virt_incr和当前值it_virt_value分别保存到局部变量interval和val中.

  (4)如果which=ITIMER_PROF,则查询当前进程的ITIMER_PROF间隔定时器.于是简单地将计数器初值it_prof_incr和当前值it_prof_value分别保存到局部变量interval和val中.

  (5),通过转换函数jiffiestotv()将val和interval转换成timeval格式的时间值,并保存到value->it_value和value->it_interval中,作为查询结果返回.

  7.7.3.2 setitimer()系统调用的实现

  函数sys_setitimer()不仅设置调用进程的指定间隔定时器,还返回该间隔定时器的原有信息.它有三个参数:(1)which,含义与 sys_getitimer()中的参数相同.(2)输入参数value,指向用户空间中的一个itimerval结构,含有待设置的新值.(3)输出参数ovalue,指向用户空间中的一个itimerval结构,用于接收间隔定时器的原有信息.

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

  /* SMP: Again, only we play with our itimers, and signals are SMP safe

  * now so that is not an issue at all anymore.

  */

  asmlinkage long sys_setitimer(int which, struct itimerval *value,

  struct itimerval *ovalue)

  {

  struct itimerval set_buffer, get_buffer;

  int error;

  if (value) {

  if(copy_from_user(&set_buffer, value, sizeof(set_buffer)))

  return -EFAULT;

  } else

  memset((char *) &set_buffer, 0, sizeof(set_buffer));

  error = do_setitimer(which, &set_buffer, ovalue ? &get_buffer : 0);

  if (error || !ovalue)

  return error;

  if (copy_to_user(ovalue, &get_buffer, sizeof(get_buffer)))

  return -EFAULT;

  return 0;

  }

  对该函数的注释如下:

  (1)在输入参数指针value非空的情况下,调用copy_from_user()宏将用户空间中的待设置信息拷贝到内核空间中的set_buffer结构变量中.如果value指针为空,则简单地将set_buffer结构变量全部置0.

  (2)调用do_setitimer()函数完成实际的设置操作.如果输出参数ovalue指针有效,则以内核变量get_buffer的地址作为 do_setitimer()函数的第三那个调用参数,这样当do_setitimer()函数返回时,get_buffer结构变量中就将含有当前进程的指定间隔定时器的原来信息.Do_setitimer()函数返回0值表示成功,非0值表示失败.

  原文地址 http://tech.ddvip.com/2007-03/117353696820628.html

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号