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