Linux系统进程间隔定时器Itimer(上)(3)
文章作者 100test 发表时间 2007:03:14 16:42:10
来源 100Test.Com百考试题网
当用户通过setitimer()系统调用来设置进程的ITIMER_REAL间隔定时器时,it_real_incr被设置成非零值,于是该系统调用相应地设置好real_timer.expires值,然后进程的real_timer定时器就被加入到内核动态定时器链表中,这样该进程的ITIMER_REAL间隔定时器就被启动了。当real_timer定时器到期时,它的关联函数it_real_fn()将被执行。注意!所有进程的real_timer定时器的function函数指针都指向it_real_fn()这同一个函数,因此it_real_fn()函数必须通过其参数来识别是哪一个进程,为此它将unsigned long类型的参数p解释为进程task_struct结构的地址。该函数的源码如下
(kernel/itimer.c):
void it_real_fn(unsigned long __data)
{
struct task_struct * p = (struct task_struct *) __data.
unsigned long interval.
send_sig(SIGALRM, p, 1).
interval = p->it_real_incr.
if (interval) {
if (interval > (unsigned long) LONG_MAX)
interval = LONG_MAX.
p->real_timer.expires = jiffies interval.
add_timer(&.p->real_timer).
}
} |
函数it_real_fn()的执行过程大致如下:
(1)首先将参数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文件中。