Linux系统进程间隔定时器Itimer
当前值肯定是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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |